//题目 通过后续遍历 中序遍历 得出一棵树 ,然后按树的层次遍历打印
PS:以前对于这种用指针的题目是比较头痛的,现在做了一些链表操作后,感觉也不难
先通过后续中序建一棵树,然后通过BFS遍历这棵树
提供测试样例
4
4 1 3 2
2 3 1 4
10
10 7 6 9 8 5 4 1 3 2
7 10 6 2 5 9 8 3 1 4
//题目 通过后续遍历 中序遍历 得出一棵树 ,然后按树的层次遍历打印 #include<stdio.h> #include<iostream> #include<queue> using namespace std; int back[90]; int mid[90]; int n; struct data{ int v; int no; data *left,*right; }; data *head=new data; data *rhead=head; void build(){ int i,j; head->v=back[n]; head->left=NULL; head->right=NULL; int root=n,rj; for(j=1;j<=n;j++){ if(back[n]==mid[j]){ head->no=j;break; } } for(i=n-1;i>=1;i--){ for(j=1;j<=n;j++){ if(back[i]==mid[j]){ rj=j;break; } } head=rhead; while(1){ if((rj < head->no)&&head->left!=NULL){ head=head->left;continue; } if((rj > head->no)&&head->right!=NULL){ head=head->right;continue; }break; } if(rj < head->no){ head->left=new data; head=head->left; head->v=back[i]; head->no=rj; head->left=NULL; head->right=NULL; }else{ head->right=new data; head=head->right; head->v=back[i]; head->no=rj; head->left=NULL; head->right=NULL; } } } void bfs(){ data *first,*second; first=rhead; queue<data *>qq; qq.push(first); int ok=0; while(!qq.empty()){ if(ok==0){ ok=1; printf("%d",qq.front()->v); }else{ printf(" %d",qq.front()->v); } second=qq.front(); qq.pop(); if(second->left!=NULL){ qq.push(second->left); } if(second->right!=NULL){ qq.push(second->right); } } printf("\n"); } int main() { while(scanf("%d",&n)!=EOF){ int i; head=new data; rhead=head; for(i=1;i<=n;i++){ scanf("%d",&back[i]); } for(i=1;i<=n;i++){ scanf("%d",&mid[i]); } build(); bfs(); } return 0; }