考研数据结构(每日一题)
题目:设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,求其后序序列post。
算法图解:
算法思想:
对于一般二叉树,仅仅根据先序或后序序列是不能确定另一个遍历序列。但对于满二叉树,任意一个结点的左右子树均有相同的结点数。
先序序列的第一个结点是后序序列的最后一个结点,由此可以得出先序序列pre[l1…h1]转化为后序序列post[l2…h2],运用递归,可得出递归模型为:
f(pre,l1,h1,post,l2,h2) = 不做任何事 h1<l1时 f(pre,l1,h1,post,l2,h2) =
post[h2] = pre[l1] 其他情况
中间位置:half=(h1-l1)/2
将pre[l1+1,l1+half]左子树转换为post[l2,l2+half-1],即f(pre,l1+1,l1+half,post,l2,l2+half-1)
将pre[l1+half+1,h1]右子树转换为post[l2+half,h2-1],即f(pre,l1+half+1,h1,post,l2+half,h2-1)
其中,post[h2]=pre[l1]表示后序系列的最后一个结点(根结点)等于先序序列的第一个结点(根结点)
完整代码:
void PreToPost(ElemType pre[],int l1,int h1,ElemType post[],int l2, int h2){
int half;
if(h1 >= l1){
post[h2] = pre[l1];
half = (h1 - l1) / 2;
PreToPost(pre,l1 + 1,l1 + half,post,l2,l2 + half - 1); //转换左子树
PreToPost(pre,l1 + half + 1,h1,post,l2 + half,h2 - 1); //转换右子树
}
}
测试代码:
ElemType *pre = "ABCDEFG";
ElemType post[MaxSize];
PreToPost(pre,0,6,post,0,6);
printf("后序序列:");
for (int i = 0; i <= 6; i++)
{
printf("%c",post[i]);
}
printf("\n");