题目描述
给出一颗二叉树的后序和中序遍历结果,输出这颗二叉树的层次遍历结果。
输入
第一行一个整数n(<= 30),表示二叉树上结点的个数。
第二行n个整数表示后序遍历结果。
第三行n个整数表示中序遍历结果。
输出
输出层次遍历结果。
样例输入
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
样例输出
4 1 6 3 5 7 2
算法实现:
#include <cstdio> #include <cstring> #include <queue> #include <iostream> using namespace std; const int maxn=50; struct node //节点 { int date; node* ld; node* rd; } ; int pre[maxn],in[maxn],post[maxn]; int n; //节点个数 node* create(int postFirst,int postEnd,int inFirst,int inEnd) //由后序和中序构建一颗树 形参分别为后序和中序排列的首元素尾元素 { if(postFirst>postEnd) //如果遍历到后序的首元素大于后序的尾元素下标(结点全部遍历完) 结束 return NULL; node* root=new node; //建立一个新的节点,存放当前二叉树的根节点 root->date =post[postEnd]; //新节点的数据域为当前根节点的值 int k; for(k=inFirst;k<=inEnd;k++) //找到 中序数组中与后序尾元素大小相等的元素 记录下标 k { if(in[k]==post[postEnd]) break; } int numleft=k-inFirst; //该下标即为左子树的节点个数 root->ld =create(postFirst,postFirst+numleft-1,inFirst,k-1);//递归找子序列的左子树和右子树 root->rd =create(postFirst+numleft,postEnd-1,k+1,inEnd); return root; } int num=0; //已经输出的节点个数,便于空格输出 void bfs(node* root) { queue<node*> q; q.push(root); while(!q.empty() ) { node* now=q.front() ; q.pop() ; cout<<now->date; num++; if(num<n) cout<<' '; if(now->ld !=NULL) q.push(now->ld ); if(now->rd !=NULL) q.push(now->rd ); } } int main() { cin>>n; for(int i=0;i<n;i++) //后序输入 cin>>post[i]; for(int i=0;i<n;i++) //中序输入 cin>>in[i]; node* root=create(0,n-1,0,n-1); bfs(root); //层序输出 return 0; }