这是已知二叉树后序遍历数组和中序遍历数组的情况下,采用递归算法实现前序遍历数组的输出
#include<bits/stdc++.h>
using namespace std;
int post[999],in[999];
void pre(int root,int start,int end){//root是整棵树在后序遍历的根结点,start和end分别是中序遍历的开始和结束
if(start>end){
return;
}
int i=start;//i从中序遍历的开始点开始,注意这里千万i不要取0开始,因为无法实现后面的递归
while(i<end&&in[i]!=post[root]){
i++;
}
//这一步结束,从中序遍历可知右子树数量为end-i+1,左子树数量为root-(end-i+1);
printf("%d ",post[root]);//打印根结点
//递归实现打印左子树
//root-(end-i+1)是左子树在后序遍历的根结点,start和i-1分别是左子树在中序遍历的开始和结束
pre(root-end+i-1,start,i-1);
//递归实现打印右子树
//root-1是右子树在后序遍历的根结点,i+1和end分别是左子树在中序遍历的开始和结束
pre(root-1,i+1,end);
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
scanf("%d",&post[i]);//后序遍历数组
for(int i=0;i<n;i++)
scanf("%d",&in[i]);//中序遍历数组
pre(m-1,0,n-1);//传入对应的参数
return 0;
}