7-10 樹的遍歷 (25 分)
阿新 • • 發佈:2018-12-10
給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。
輸入格式:
輸入第一行給出一個正整數N(≤30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。
輸出格式:
在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。
輸入樣例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
輸出樣例:
4 1 6 3 5 7 2
#include<iostream> #include<algorithm> #include<cstring> #include<cctype> using namespace std; int n,i; int h[35],z[35],Tree[100010],mx=0; typedef struct tree{ int data; tree *l,*r; }tree; int search(int l1,int r1,int l2,int r2) { for(int i=l2;i<=r2;i++) { if(z[i]==h[r1]) return i; } } tree* creat(int l1,int r1,int l2,int r2,int n,int w) { tree* t; t=(tree*)malloc(sizeof(tree)); t->data=h[r1]; Tree[w]=h[r1]; mx=max(mx,w); if(n==0) { t->l=NULL; t->r=NULL; } else { int f; f=search(l1,r1,l2,r2); int n1=f-l2,n2=r2-f; if(f!=l2) t->l=creat(l1,l1+n1-1,l2,f-1,f-l2,w*2); else t->l=NULL; if(f!=r2) t->r=creat(l1+n1,r1-1,f+1,r2,r2-f,w*2+1); else t->r=NULL; } return t; } void remove_tree(tree* root) { if(root!=NULL) { remove_tree(root->l); remove_tree(root->r); free(root); } } int main() { cin>>n; memset(Tree,0,sizeof(Tree)); for(i=1;i<=n;i++) cin>>h[i]; for(i=1;i<=n;i++) cin>>z[i]; tree* root; root=creat(1,n,1,n,n,1); for(i=1;i<=mx;i++) if(Tree[i]!=0) { printf("%d",Tree[i]); if(i<mx) printf(" "); } remove_tree(root); return 0; }