由中根序列和后根序列重建二叉树

来源:互联网 发布:京东金融 免费数据 编辑:程序博客网 时间:2024/06/03 22:01

4:由中根序列和后根序列重建二叉树

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
500ms 
内存限制: 
65535kB
描述

我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列、前根序列和后根序列。反过来,如果给定二叉树的中根序列和后根序列,或者给定中根序列和前根序列,可以重建一二叉树。本题输入一棵二叉树的中根序列和后根序列,要求在内存中重建二叉树,最后输出这棵二叉树的前根序列。

用不同的整数来唯一标识二叉树的每一个结点,下面的二叉树


中根序列是9 5 32 67

后根序列9 32 67 5

前根序列5 9 67 32

输入
两行。第一行是二叉树的中根序列,第二行是后根序列。每个数字表示的结点之间用空格隔开。结点数字范围0~65535。暂不必考虑不合理的输入数据。
输出
一行。由输入中的中根序列和后根序列重建的二叉树的前根序列。每个数字表示的结点之间用空格隔开。
样例输入
9 5 32 679 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;}


阅读全文
0 0
原创粉丝点击