问题描述
设有一颗满二叉树(所有节点值均不同),已知其先序序列pre,设计一个算法求其后序序列post
算法思想
对于一般二叉树,仅根据先序或者后序序列并不能确定出另一个遍历序列,但对于满二叉树,任一节点的左、右子树均含有相等的节点数。或者说,按照几何形状来划分呈轴对称,即可以根据先序序列和满二叉树这两个条件便可以将该二叉树画出来。
满二叉树中,先序序列的第一个节点作为后序序列的最后一个节点,由此便可以得出将先序序列 pre[l1⋯h1] 转换为后序序列 post[l2⋯h2] 的递归模型;
f(pre,l1,h1,post,l2,h2)=⎧⎩⎨⎪⎪不做任何事情,f(pre,l1+1,l1+half,post,l2,l2+half−1),f(pre,l1+half+1,h1,post,l2+half,h2−1),若h1<l1;其中 half=h1−l22若h1>l1;转换左子树若h1>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);
}
}
具体代码见附件。
附件
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef char ElemType;
void PreToPost(ElemType*,int,int,ElemType*,int,int);
int main(int argc,char* argv[])
{
ElemType pre[MaxSize]="ABCDEFG";
ElemType post[MaxSize];
PreToPost(pre,0,6,post,0,6);
printf("PreOrder is %s\n",pre);
printf("PostOrder is ");
for(int i=0;i<=6;i++){
printf("%c",post[i]);
}
printf("\n");
return 0;
}
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);
}
}