已知二叉树前序中序求后序

经常出现在笔试选择题中。

例:若某二叉树的前遍历访问顺序是序abdgcefh,中序遍历顺序是dgbaechf 
(1)由前序遍历结果我们可知a为根结点,再看中序遍历结果,因为中序遍历顺序是左子树、根、右子树,因此由“中序遍历顺序是dgbaechf”可断定,dgb为该二叉树的左子树中序遍历结果,echf为右子树中序遍历结果。
(2)由前序遍历结果可知,左子树的前序遍历结果是bdg,右子树的前序遍历结果是cefh;因此,和第一步分析类似,可知b为左子树的根,再由“dgb为该二叉树的左子树中序遍历结果”可知,dg为该左子树的左子树的中序遍历结果,再由dg在前序遍历结果中排列顺序dg可知,d为根,因此由“dg为该左子树的左子树的中序遍历结果”可推出g为d的右孩子。
到此为止,可以完全推断出该二叉树的左子树的结构了。
按照同样方法,可以推断出该二叉树的右子树的结构,因此整个二叉树的结构图如下:
据此图,不难看出该二叉树的后序遍历结果是:gdbehfca.

 

在前序中找到根节点,然后在中序中找到对应的节点,然后分成左右子树进行递归处理。
代码及示例运行结果如下:
#include <stdio.h>
#include <string.h>

bool PostOrder0(char *preBegin, char *preEnd, char *inBegin, char *inEnd, char *post)
{
if (!preBegin || !inBegin) return false;
if (preBegin == preEnd || inBegin == inEnd) return true;
if (*preBegin == 0 || *inBegin == 0) return true;
if (preBegin + 1 == preEnd && inBegin + 1 == inEnd && *preBegin == *inBegin)
{
*post = *preBegin;
return true;
}
char temp[2] = {*preBegin, 0};
char *inPtr = strstr(inBegin, temp);
if (inPtr == NULL)
{
return false;
}
*(post + (preEnd - preBegin - 1)) = *preBegin;
int lLength = inPtr - inBegin;
int rLegnth = inEnd - inPtr - 1;
PostOrder0(preBegin + 1, preBegin + 1 + lLength, inBegin, inBegin + lLength, post);
PostOrder0(preBegin + lLength + 1, preEnd, inPtr + 1, inEnd, post + lLength);
return true;
}

char* PostOrder(char *preOrder, char *inOrder)
{
static char postOrder[1000] = {0};
if (PostOrder0(preOrder, preOrder + strlen(preOrder), inOrder, inOrder + strlen(inOrder), postOrder))
return postOrder;
else
return "";
}

int main()
{
char s[1000]={0};
char t[1000]={0};
scanf("%s%s",s,t);
printf("%s\n",PostOrder(s,t));
return 0;
}

/*
ABDECF
DBEACF
DEBFCA
Press any key to continue
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值