二叉树重建
2010-09-08 17:21
281 查看
对于二叉树T,可以递归定义
它的先序遍历、中序遍历和后序遍历如下:
PreOrder(T
)=T的根节点
+PreOrder(T的左子树)+PreOrder(T的右子树)
InOrder(T)
=InOrder(T的左子树)+T的根节点
+InOrder(T的右子树)
PostOrder(T)
=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点
其中,加号表示字符串连接运算。
[问题]
输入一棵二叉树的先序遍历
和中序遍历
序列,输出它的后序遍历
序列。
样例输入:
DBACEGF ABCDEFG
BCAD CBAD
样例输出:
ACBFGED
CDAB
[分析]
先序遍历的第一个字符就是根,因此只需在中序遍历中找到它,就知道左右子树的先序和中序遍历了。例如:
先序:D
BACEGF 中序:ABCD
EFG
由先序遍历的第一个字符D
可知,此二叉树的根节点为D
,并且:
左子树的先序遍历为:BAC 中序遍历为:ABC
右子树的先序遍历为:EGF 中序遍历为:EFG
这样,可以编写一个递归程序
:
它的先序遍历、中序遍历和后序遍历如下:
PreOrder(T
)=T的根节点
+PreOrder(T的左子树)+PreOrder(T的右子树)
InOrder(T)
=InOrder(T的左子树)+T的根节点
+InOrder(T的右子树)
PostOrder(T)
=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点
其中,加号表示字符串连接运算。
[问题]
输入一棵二叉树的先序遍历
和中序遍历
序列,输出它的后序遍历
序列。
样例输入:
DBACEGF ABCDEFG
BCAD CBAD
样例输出:
ACBFGED
CDAB
[分析]
先序遍历的第一个字符就是根,因此只需在中序遍历中找到它,就知道左右子树的先序和中序遍历了。例如:
先序:D
BACEGF 中序:ABCD
EFG
由先序遍历的第一个字符D
可知,此二叉树的根节点为D
,并且:
左子树的先序遍历为:BAC 中序遍历为:ABC
右子树的先序遍历为:EGF 中序遍历为:EFG
这样,可以编写一个递归程序
:
#include <cstdio> #include <cstring> void build(int n, char* s1, char* s2, char* s) { if (n<=0) { return; } int p=strchr(s2, s1[0])-s2; // 找到根结点在中序遍历中的位置 build(p, s1+1, s2, s); // 左子树的后序遍历 build(n-p-1, s1+p+1, s2+p+1, s+p); // 右子树的后序遍历 s[n-1]=s1[0]; // 把根节点添加到最后 printf("%c", s1[0]); // 直接打印出结果 } int main() { char s1[128]={0}; char s2[128]={0}; char res[128]={0}; while (scanf("%s%s", s1, s2)==2) { int n=strlen(s1); build(n, s1, s2, res); res ='/0'; printf("/n%s/n",res); } return 0; }
相关文章推荐
- Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序重建二叉树@LeetCode
- 【九度OJ1385】|【剑指offer6】重建二叉树
- 重建二叉树
- nyoj-756 重建二叉树
- 剑指offer面试题6 重建二叉树(java)
- 重建二叉树
- 剑指offer--面试题6 重建二叉树
- 重建二叉树
- 【剑指offer】第六题-重建二叉树
- 重建二叉树
- 九度OJ_1385:重建二叉树
- 剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告
- 牛客《剑指Offer》 重建二叉树
- 剑指offer——重建二叉树
- 重建二叉树
- 数据结构-重建二叉树
- 重建二叉树
- 重建二叉树
- 根据中序和先序重建二叉树+二叉树的镜像+二叉树的深度+判断后序序列+判断子树
- 根据二叉树的前序和中序序列来重建二叉树