根据后序遍历和中序遍历结果还原二叉树
来源:互联网 发布:安全狗linux版 编辑:程序博客网 时间:2024/05/16 00:36
以前做这种题蛮熟练的,放了两个学期没管它,今天再来做就太.......伤脑子了
不过还好,还是想起怎么做了
这里把我的方法分享给大家,希望还不会的朋友能有所收获,也希望能得到更好的解决办法
【题目】
假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序
遍历序列为 ( ) 。
A. ABCDEFGHIJ
B. ABDEGHJCFI
C. ABDEGHJFIC
D. ABDEGJHCFI
由题,后序遍历的最后一个值为A,说明本二叉树以节点A为根节点(当然,答案中第一个节点都是A,也证明了这一点)
下面给出整个分析过程
【第一步】
由后序遍历的最后一个节点可知本树根节点为【A】
加上中序遍历的结果,得知以【A】为根节点时,中序遍历结果被【A】分为两部分【DBGEHJ】【A】【CIF】
于是作出第一幅图如下
【第二步】
将已经确定了的节点从后序遍历结果中分割出去
即【DGJHEBIFC】---【A】
此时,位于后序遍历结果中的最后一个值为【C】
说明节点【C】是某棵子树的根节点
又由于【第一步】中【C】处于右子树,因此得到,【C】是右子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【CIF】中来,在【CIF】中,由于【C】是根节点,所以【IF】都是这棵子树的右子树,【CIF】子树没有左子树,于是得到下图
【第三步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHEBIF】---【CA】
此时,位于后序遍历结果中的最后一个值为【F】
说明节点【F】是某棵子树的根节点
又由于【第二步】中【F】处于右子树,因此得到,【F】是该右子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【C】【IF】中来,在【IF】中,由于【F】是根节点,所以【I】是【IF】这棵子树的左子树,于是得到下图
【第四步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHEB】---【IFCA】
此时,位于后序遍历结果中的最后一个值为【B】
说明节点【B】是某棵子树的根节点
又由于【第一步】中【B】处于【A】的左子树,因此得到,【B】是该左子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【GEHJ】【A】【C】【F】【I】,于是得到下图
【第五步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHE】---【BIFCA】
此时,位于后序遍历结果中的最后一个值为【E】
说明节点【E】是某棵子树的根节点
又由于【第四步】中【E】处于【B】的右子树,因此得到,【E】是该右子树的根节点
于是回到中序遍历结果【D】【B】【GEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【HJ】【A】【C】【F】【I】,于是得到下图
【第六步】
将已经确定了的节点从后序遍历中分割出去
即【DGJH】---【EBIFCA】
此时,位于后序遍历结果中的最后一个值为【H】
说明节点【H】是某棵子树的根节点
又由于【第五步】中【H】处于【E】的右子树,因此得到,【H】是该右子树的根节点
于是回到中序遍历结果【D】【B】【G】【E】【HJ】【A】【C】【F】【I】中来,根据【H】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【H】【J】【A】【C】【F】【I】,于是得到下图
至此,整棵二叉树已经还原
现在对该二叉树进行前序遍历便能得到我们想要的答案
【B】
不过还好,还是想起怎么做了
这里把我的方法分享给大家,希望还不会的朋友能有所收获,也希望能得到更好的解决办法
【题目】
假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序
遍历序列为 ( ) 。
A. ABCDEFGHIJ
B. ABDEGHJCFI
C. ABDEGHJFIC
D. ABDEGJHCFI
由题,后序遍历的最后一个值为A,说明本二叉树以节点A为根节点(当然,答案中第一个节点都是A,也证明了这一点)
下面给出整个分析过程
【第一步】
由后序遍历的最后一个节点可知本树根节点为【A】
加上中序遍历的结果,得知以【A】为根节点时,中序遍历结果被【A】分为两部分【DBGEHJ】【A】【CIF】
于是作出第一幅图如下
【第二步】
将已经确定了的节点从后序遍历结果中分割出去
即【DGJHEBIFC】---【A】
此时,位于后序遍历结果中的最后一个值为【C】
说明节点【C】是某棵子树的根节点
又由于【第一步】中【C】处于右子树,因此得到,【C】是右子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【CIF】中来,在【CIF】中,由于【C】是根节点,所以【IF】都是这棵子树的右子树,【CIF】子树没有左子树,于是得到下图
【第三步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHEBIF】---【CA】
此时,位于后序遍历结果中的最后一个值为【F】
说明节点【F】是某棵子树的根节点
又由于【第二步】中【F】处于右子树,因此得到,【F】是该右子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【C】【IF】中来,在【IF】中,由于【F】是根节点,所以【I】是【IF】这棵子树的左子树,于是得到下图
【第四步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHEB】---【IFCA】
此时,位于后序遍历结果中的最后一个值为【B】
说明节点【B】是某棵子树的根节点
又由于【第一步】中【B】处于【A】的左子树,因此得到,【B】是该左子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【GEHJ】【A】【C】【F】【I】,于是得到下图
【第五步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHE】---【BIFCA】
此时,位于后序遍历结果中的最后一个值为【E】
说明节点【E】是某棵子树的根节点
又由于【第四步】中【E】处于【B】的右子树,因此得到,【E】是该右子树的根节点
于是回到中序遍历结果【D】【B】【GEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【HJ】【A】【C】【F】【I】,于是得到下图
【第六步】
将已经确定了的节点从后序遍历中分割出去
即【DGJH】---【EBIFCA】
此时,位于后序遍历结果中的最后一个值为【H】
说明节点【H】是某棵子树的根节点
又由于【第五步】中【H】处于【E】的右子树,因此得到,【H】是该右子树的根节点
于是回到中序遍历结果【D】【B】【G】【E】【HJ】【A】【C】【F】【I】中来,根据【H】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【H】【J】【A】【C】【F】【I】,于是得到下图
至此,整棵二叉树已经还原
现在对该二叉树进行前序遍历便能得到我们想要的答案
【B】
- 根据后序遍历和中序遍历结果还原二叉树
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- 根据后序-中序遍历结果 来还原一颗二叉树
- 二叉树问题-根据前序遍历结果和中序遍历结果得出后序遍历结果
- 根据二叉树的前序遍历和中序遍历(或者中序遍历和后序遍历)还原二叉树
- 二叉树遍历问题:已知中序遍历和后序遍历结果,求前序遍历结果
- 根据二叉树的后序遍历以及中序遍历还原二叉树
- 根据前序遍历-中序遍历结果 来还原一颗二叉树
- 题目1078:二叉树遍历(根据前序和中序遍历结果,获得后序遍历)
- 【二叉树】根据二叉树的中序遍历和前序遍历,还原二叉树
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 根据二叉树先序和中序遍历结果求其后序遍历
- 由二叉树的前序遍历和后续遍历结果还原二叉树,并后序遍历打印
- 根据二叉树前序、中序遍历还原二叉树
- 根据二叉树的前序遍历和中序遍历的结果,重建二叉树
- LeetCode之通过二叉树的中序遍历和后序遍历还原二叉树
- 根据前序遍历和中序遍历还原二叉树
- FrameLayout
- MFC单文档中修改窗口标题和标题栏图标
- 夫妻相处最佳模式
- ie6不兼容input[type="text"]的样式写法
- Oracle Data Guard Linux 平台 Physical Standby 搭建实例
- 根据后序遍历和中序遍历结果还原二叉树
- HDU4544 湫湫系列故事——消灭兔子(贪心+优先队列)
- UTMS 信令培训(15)
- php写mysql语句需要注意的一个小地方
- DB2中的数据类型,默认值,及列修改DDL语句
- matlab中如何把m文件默认打开方式设成editor
- apk升级
- Couldn't register com.yourcompany.XXX with bootstrap server. Error: unknown error code.解决方法
- git命令之git var/config 列出git配置信息