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