已知二叉树前序中序求后序
来源:互联网 发布:mysql 查找一条记录 编辑:程序博客网 时间:2024/05/04 08:19
经常出现在笔试选择题中。
例:若某二叉树的前遍历访问顺序是序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
*/
- 已知二叉树前序中序求后序
- 已知二叉树先序中序求后序,已知后序中序求先序
- 二叉树已知前序中序求后序
- 二叉树已知中序前序求后序
- 二叉树已知先序中序求后序、已知中序后序求先序
- 二叉树已知先序中序求后序,已知后序中序求先序
- 已知二叉树前序和中序求后序
- 已知中序后序创建二叉树
- 已知后序中序求先序(二叉树)
- 二叉树_已知先序中序求后序
- 已知前序中序->构建二叉树
- 已知二叉树前序中序,构造二叉树
- 已知二叉树后序中序,构造二叉树
- 已知二叉树前序中序遍历重建二叉树
- 二叉树的重建,已知先序中序求后序,已知后序中序求先序
- 二叉树:已知前序中序求后序结果的问题
- 二叉树:已知先序中序求后序的算法
- nyoj221 已知条件构造二叉树
- STM32的时钟管理分析
- 利用Win7合成器消除网页垃圾声音【老牌系统】
- HDU 1538 - A Puzzle for Pirates(海盗分金)
- 快速配置maven环境
- PHP面向对象之重写与重载
- 已知二叉树前序中序求后序
- 素数 + nyoj169
- vbs正则表达式代码
- U-Mail邮件中继功能使用方法
- C++程序设计练习:从文件中读取数据到结构体数组
- sap 用户接口(User exit)
- Distinct Sub-matrix HDOJ4416
- android_Socket
- U-Mail试用版主要限制(Webmail SSL安全登录)