给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:7
4 1 3 2 6 5 7
1 2 3 4 5 6 7
输出样例:
2 3 1 5 7 6 4
代码实现
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <map> #include <vector> #include <set> #include <cmath> using namespace std; typedef long long ll; const int maxn=65535; int in[50], pre[50]; typedef struct node { int key; struct node *lson, *rson; }*root; node* Bitree(int In[], int Pre[], int N) { if(N==0) return NULL; node *Root = new node; Root->key = Pre[0]; // 在有N个几点的前序中第一个节点是根节点 int i; for(i=0; i<N; i++) { if(In[i]==Pre[0]) //在中序中找出根节点,以左是左子树,以右是右子树 break; } Root->lson = Bitree( In, Pre+1, i ); //建立左子树,前序从第pre+1开始,i代表左子树的节点数; Root->rson = Bitree( In+i+1, Pre+i+1, N-i-1); //建立右子树,中序从第In+i+1个开始,前序从Pre+i+1开始,节点数为N-i-1; return Root; } void outtree(node* Root) { if(Root!=NULL) { outtree(Root->lson); outtree(Root->rson); cout << Root->key <<" "; } } int main() { int N; int i; cin >> N; for(i=0; i<N; i++) cin >> pre[i]; for(i=0; i<N; i++) cin >> in[i]; node* root = Bitree(in,pre,N); // (中序,前序,节点数) outtree(root); cout << endl; return 0; }