前序遍历:abdeijcfg
中序遍历:dbiejafcg
后序遍历:dijebfgca //期望结果
解法:先序中的首元素a 必为该二叉树的根结点,在中序序列里a之前的元素一定是a的左子树部分,a之后的元素一定为a的右子树部分。
所以,可以看作
先序: root | 左子树 | 右子树
中序: 左子树 | root | 右子树
由此, 我们可以递归的得到该二叉树。 即,先得到root根结点,然后,对左、右子树进行同样的操作。
所以建立二叉树的过程可看作:
MakeBinaryTree(...)
{
得到root 根结点;
MakeBinaryTree( 左子树 );
MakeBinaryTree( 右子树 );
}
题外话:
如果已知中序,后序遍历结果,求先序。由于后序可看作 左子树 | 右子树 | 根,可以考虑从后向前操作,这样可以先确定根。
#include <stdio.h>
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;
BTNode* CreateBinaryTree(const char *pre,const char *mid,int len)
{
if(len == 0)
{
return NULL;
}
BTNode *root = (BTNode *)malloc(sizeof(BTNode));
root->data = *pre;
char *rootPlace = strchr(mid,*pre);
int leftLen = strlen(mid) - strlen(rootPlace);
int rightLen = len - leftLen - 1;
root->lchild = CreateBinaryTree(pre+1,mid,leftLen);
root->rchild = CreateBinaryTree(pre+leftLen+1,rootPlace+1,rightLen);
return root;
}
void PostTraversal(BTNode *root)
{
if(root != NULL)
{
PostTraversal(root->lchild);
PostTraversal(root->rchild);
printf("%c",root->data);
}
}
int main()
{
char *pre = "abdeijcfg";
char *mid = "dbiejafcg";
int len = strlen(pre);
BTNode *root = CreateBinaryTree(pre,mid,len);
PostTraversal(root); //dijebfgca
printf("\n");
return 0;
}