4:由中根序列和后根序列重建二叉树
-
总时间限制:
- 500ms 内存限制:
- 65535kB
-
描述
-
我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列、前根序列和后根序列。反过来,如果给定二叉树的中根序列和后根序列,或者给定中根序列和前根序列,可以重建一二叉树。本题输入一棵二叉树的中根序列和后根序列,要求在内存中重建二叉树,最后输出这棵二叉树的前根序列。
用不同的整数来唯一标识二叉树的每一个结点,下面的二叉树
中根序列是9 5 32 67
后根序列9 32 67 5
前根序列5 9 67 32
输入
- 两行。第一行是二叉树的中根序列,第二行是后根序列。每个数字表示的结点之间用空格隔开。结点数字范围0~65535。暂不必考虑不合理的输入数据。 输出
- 一行。由输入中的中根序列和后根序列重建的二叉树的前根序列。每个数字表示的结点之间用空格隔开。 样例输入
-
9 5 32 67 9 32 67 5
样例输出
-
5 9 67 32
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; int Mid[10005]; int Last[1005]; struct Node { int x; Node*left; Node*right; Node() { x=0;left=NULL;right=NULL; } }; Node*root; Node*Build(int s1,int e1,int s2,int e2) { Node*p=new Node(); if(s1==e1) { p->x=Mid[s1];return p; } int t; for(t=s1;t<=e1;++t) { if(Mid[t]==Last[e2])break; } p->x=Mid[t]; if(t==s1) { p->right=Build(s1+1,e1,s2,e2-1); } else if(t==e1) { p->left=Build(s1,e1-1,s2,e2-1); } else { p->left=Build(s1,t-1,s2,t-1-s1+s2); p->right=Build(t+1,e1,t+2-e1-e2 ,e2-1); } return p; } void Pre(Node*p) { if(p==NULL)return; cout<<p->x<<" "; Pre(p->left); Pre(p->right); } int main() { int a,num1=0,num2=0; char c; while(cin>>a) { Mid[num1++]=a; c=getchar(); if(c=='\n') break; } while(cin>>a) { Last[num2++]=a; c=getchar(); if(c=='\n') break; } root=Build(0,num1-1,0,num2-1); Pre(root); return 0; }