题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历
首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树
前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗树的根节点,
然后拆分出左右子树,对左右子树进行相同的操作,也就是将建树的这个函数递归调用下去
build函数还是理解了好久啊话说= =仍然是学习的代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<algorithm> 6 using namespace std; 7 8 typedef long long LL; 9 const int maxn=1005; 10 11 void build(int n,int *s1,int *s2,int *s){ 12 if(n<=0) return; 13 int p; 14 for(int i=0;i<n;i++){ 15 if(s2[i]==s1[0]){ 16 p=i;//在中序遍历中找到根结点的位置 17 break; 18 } 19 } 20 21 build(p,s1+1,s2,s);//p为左子树的区间长度,s1+1是在前序遍历中左子树的开头,s2是在中序遍历中左子树的开头 22 build(n-p-1,s1+p+1,s2+p+1,s+p);//n-p-1为右子树的区间长度,s1+p+1 是在前序遍历中右子树的开头,s2是在中序遍历中右子树的开头 23 s[n-1]=s1[0]; 24 } 25 26 int main() 27 { 28 int n,i,ans[maxn],s1[maxn],s2[maxn]; 29 while(scanf("%d",&n)!=EOF){ 30 for(i=0;i<n;i++) scanf("%d",&s1[i]); 31 for(i=0;i<n;i++) scanf("%d",&s2[i]); 32 build(n,s1,s2,ans); 33 for(i=0;i<n-1;i++) printf("%d ",ans[i]); 34 printf("%d\n",ans[i]); 35 } 36 return 0; 37 }
时间: 2024-10-07 05:02:50