设有一颗满二叉树(所有值均不相同),已知先序序列,求后序序列
思想:先序序列的第一个节点为根,且为后序序列的最后一个结点。将左右子树分别看成一个树,左右子树的根分别为对应后序的最后一个结点,以此类推,直到全部遍历完成。
代码:
void getpostBypre(ElemType pre[],int prestart,int preend,EleType post[],int poststart,int postend){
//pre先序序列,prestart先序起始下标,preend终止下标
//post后序序列 , poststart后序起始下标,postend终止下标
int mid;
if(preend>=prestart){
post[postend]=pre[prestart];//满二叉树先序的第一个元素为后序的最后一个元素
mid=(preend-prestart)/2;
getpostBypre(pre,prestart+1,prestart+mid,post,poststart,postend+mid-1);//处理L
getpostBypre(pre,prestart+mid+1,preend,post,poststart+mid,postend-1) ;//处理R
//先序为1245367的满二叉树。对应后序为4526731
//prestart=0(也就是元素1) ,preend=6(也就是元素7)
//满二叉树先序的第一个元素1为后序的最后一个元素
//mid= 3(也就是元素5,左子树的最后一个结点)
//先递归处理左,prestart+1=1(也就是元素2),preend=3(也就是元素5)
//执行 post[postend]=pre[prestart],将2放到后序遍历的左子树的最后一个元素
//然后处理右 prestart+mid+1=4(也就是元素3)
//然后执行 post[postend]=pre[prestart],将3放到后序遍历的右子树的最后一个元素
}
}