Preorder:前序遍历是按照根–>左子树–>右子树的顺序进行递归遍历
Inorder:中序遍历是按照左子树–>根–>右子树的顺序进行遍历
Posorder:后序遍历是按照左子树–>右子树–>根的顺序进行遍历
现在给出一个树的前序遍历和中序遍历,如何推出树的后序遍历呢?
举个例子
pre={1,2.3,4,5,6,7,8,9}
in={3,2,5,4,6,1,8,7,9}
根据前序遍历特点,可以直到树的根节点一定是前序遍历中第一个元素!
在中序遍历找出根的位置,也就是index=5,所以根据中序遍历特点(先遍历左子树,在遍历根最后遍历右子树),可以把in序列分为{3,2,5,4,6}和{8,7,9}也就是左右两个子树!
我们在左子树中找到根,也就是pre中第二个元素2,在in序列中找到2的位置,分出序列{3},{5,4,6},依此类推我们递归处理,每次找出树的根,递归处理左子树,右子树,最后在把根添加进后序遍历序列即可!
图示
通过上图我们可以看到,我们先分出两颗绿色的框,在分出4个红色的树,最后分出2个黄色的树!
递归代码
void reConstruction(int l,int r)
{
if(l>=r)return;
int root=pre[index++];
int m=distance(in.begin(),find(in.begin(),in.