经常出现在笔试选择题中。
例:若某二叉树的前遍历访问顺序是序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
*/