描述
给定一颗二叉树,按照层次顺序遍历,但在遍历时从最底下开始,编写函数并将各层节点通过vector返回。
二叉树节点类定义如下:
class TreeNode
{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
题目部分代码已经完成,您只需要补充并提交以下函数(外部函数形式):
vector<vector<int> > levelOrderBottom(TreeNode *root);
输入
输入描述了一棵二叉树,使用若干个整数(不超过512)表示一棵二叉树顺序表示时的结点元素值,其中0表示二叉树对应结点为空,以-1结束。
输出
输出层次遍历的结果,每层一行,每行的元素用空格隔开。
样例输入
1 2 3 0 0 4 5 -1
样例输出
4 5
2 3
1
#include<bits/stdc++.h> using namespace std; class TreeNode { public: int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode*creat() { int front=1,rear=0,x; TreeNode*qu[1005],*t,*root=NULL; while(scanf("%d",&x)!=EOF,x!=-1) { if(!x) t=NULL; else { t=(TreeNode*)malloc(sizeof(TreeNode)); t->val=x; t->left=NULL; t->right=NULL; } qu[++rear]=t; if(rear==1) root=t; else { if(t&&qu[front]) { if(rear%2==0) qu[front]->left=t; else qu[front]->right=t; } if(rear%2==1) front++; } } return root; } vector<vector<int> > levelOrderBottom(TreeNode *root) { vector<vector<int> >vv; vector<int>v; stack<vector<int> >st; queue<TreeNode*>qu1,qu2; if(!root) return vv; qu1.push(root); while(!qu1.empty()||!qu2.empty()) { while(!qu1.empty()) { TreeNode*t=qu1.front(); qu1.pop(); v.push_back(t->val); if(t->left) qu2.push(t->left); if(t->right) qu2.push(t->right); } if(!v.empty()) { st.push(v); v.clear(); } while(!qu2.empty()) { TreeNode*t=qu2.front(); qu2.pop(); v.push_back(t->val); if(t->left) qu1.push(t->left); if(t->right) qu1.push(t->right); } if(!v.empty()) { st.push(v); v.clear(); } } while(!st.empty()) { v=st.top(); st.pop(); vv.push_back(v); } return vv; } int main() { TreeNode*x=creat(); vector<vector<int> >v=levelOrderBottom(x); int i,j; for(i=0;i<v.size();i++) { for(j=0;j<v[i].size();j++) { if(j==0) printf("%d",v[i][j]); else printf(" %d",v[i][j]); } printf("\n"); } return 0; }
原文地址:https://www.cnblogs.com/kannyi/p/9000119.html
时间: 2024-10-08 21:06:35