这道题以及基础的树前中后序遍历作为学习树的开始,这些可以说是二叉树最基本的操作,真正的遍历非二叉树,以及二叉树更多操作还需要继续进行学习
其中首先学习最为基础的根据前序,中序序列输出二叉树的后序序列,其基本思想是,顺序遍历前序序列,找到每一个前序序列在中序序列中的位置,以这个位置递归重构左子树,重构右子树,最后把找到的前序序列中的数输入到后序遍历的数组中。
递归结束的条件是l>r
递归重构部分代码 也是整个程序的关键
void plant(int l,int r)
{
if(l>=r) return ;
// int root;
int root = pre[pos++];//顺序查找前序遍历数组中的数
int m;
for(int i=0;i<n;i++)//查找这个数在中序遍历数组中的位置
{
if(in[i]==root)
{
m = i;
break;
}
}
// m = distance(in.begin(),find(in.begin(),in.end(),root));//使用vector会导致指针错误,可能跟vector的后序值有关,这个问题还没有解决
plant(l,m);//重构左子树
plant(m+1,r);//重构右子树
post[jishu++] = root;//把root加入到post数组中
// post.push_back(root);
}
但是题目要求的是根据后序和中序遍历的顺序输出前序遍历的顺序,根据观察后发现,把倒过来的后序遍历当做前序遍历,把中序遍历也倒过来当做新的中序遍历,根据这两个重构出新二叉树(自认为也是“镜面”树)的后序遍历