如何根据前序、中序、后序遍历还原二叉树
2015-04-21 20:49
288 查看
面试题目或多或少会出现这样的选择题或者简答题:
首先我们得知道概念:
前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根后且左子树比右子树靠前,且第一个就是根节点;
中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果。规律:根在中;左子树在跟左边,右子树在根右边,左边部分是根结点的左子树的中序遍历序列,右边部分是根结点的右子树的中序遍历序列 ;
后序遍历:先访问当前节点的左子树,然后是当前节点的又子树,最后是当前节点。规律:根在后;子树在根前且左子树比右子树靠前,且最后一个节点是根节点。
一、前序+中序
1. 根据前序序列的第一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在前序序列中确定左右子树的前序序列;
4. 由左子树的前序序列和中序序列建立左子树;
5. 由右子树的前序序列和中序序列建立右子树。
如:已知一棵二叉树的先序遍历序列和中序遍历序列分别是abdgcefh、dgbaechf,求二叉树及后序遍历序列。
先序:abdgcefh--->a bdg cefh
中序:dgbaechf---->dgb a echf
得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。
先序:bdg--->b dg
中序:dgb --->dg b
得出结论:b是左子树的根结点,b无右子树,有左子树。
先序:dg---->d g
中序:dg----->dg
得出结论:d是b左子树的根节点,d无左子树,g是d的右子树
然后对于a 的右子树类似可以推出
最后还原: a
b c
d e f
g h
后序遍历:gdbehfca
二、后序+中序:
已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:
1. 根据后序序列的最后一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在后序序列中确定左右子树的后序序列;
4. 由左子树的后序序列和中序序列建立左子树;
5. 由右子树的后序序列和中序序列建立右子树
如还是上面题目:如:已知一棵二叉树的后序遍历序列和中序遍历序列分别是gdbehfca、dgbaechf,求二叉树
后序:gdbehfca---->gdb ehfc a
中序:dgbaechf----->dgb a echf
得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。
后序:gdb---->gd b
中序:dgb----->dg b
得出结论:b是a左子树的根节点,无右子树,有左子树dg。
后序:gd---->g d
中序:dg----->d g
得出结论:d是b的左子树根节点,g是d的右子树。
然后对于a 的右子树类似可以推出。然后还原。
三、前序+后序
前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树。 故此法无。不能唯一确定一个二叉树。
首先我们得知道概念:
前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根后且左子树比右子树靠前,且第一个就是根节点;
中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果。规律:根在中;左子树在跟左边,右子树在根右边,左边部分是根结点的左子树的中序遍历序列,右边部分是根结点的右子树的中序遍历序列 ;
后序遍历:先访问当前节点的左子树,然后是当前节点的又子树,最后是当前节点。规律:根在后;子树在根前且左子树比右子树靠前,且最后一个节点是根节点。
一、前序+中序
1. 根据前序序列的第一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在前序序列中确定左右子树的前序序列;
4. 由左子树的前序序列和中序序列建立左子树;
5. 由右子树的前序序列和中序序列建立右子树。
如:已知一棵二叉树的先序遍历序列和中序遍历序列分别是abdgcefh、dgbaechf,求二叉树及后序遍历序列。
先序:abdgcefh--->a bdg cefh
中序:dgbaechf---->dgb a echf
得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。
先序:bdg--->b dg
中序:dgb --->dg b
得出结论:b是左子树的根结点,b无右子树,有左子树。
先序:dg---->d g
中序:dg----->dg
得出结论:d是b左子树的根节点,d无左子树,g是d的右子树
然后对于a 的右子树类似可以推出
最后还原: a
b c
d e f
g h
后序遍历:gdbehfca
二、后序+中序:
已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:
1. 根据后序序列的最后一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在后序序列中确定左右子树的后序序列;
4. 由左子树的后序序列和中序序列建立左子树;
5. 由右子树的后序序列和中序序列建立右子树
如还是上面题目:如:已知一棵二叉树的后序遍历序列和中序遍历序列分别是gdbehfca、dgbaechf,求二叉树
后序:gdbehfca---->gdb ehfc a
中序:dgbaechf----->dgb a echf
得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。
后序:gdb---->gd b
中序:dgb----->dg b
得出结论:b是a左子树的根节点,无右子树,有左子树dg。
后序:gd---->g d
中序:dg----->d g
得出结论:d是b的左子树根节点,g是d的右子树。
然后对于a 的右子树类似可以推出。然后还原。
三、前序+后序
前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树。 故此法无。不能唯一确定一个二叉树。
相关文章推荐
- 如何根据前序、中序、后序遍历还原二叉树
- 数据结构——根据前序遍历和中序遍历还原二叉树
- 根据二叉树的先序和中序遍历还原二叉树
- 根据前序遍历和中序遍历还原二叉树
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- poj2255 根据二叉树的前序和中序遍历 求出树的后序遍历
- 刷题之路----根据前序遍历和中序遍历或者后序遍历和中序遍历重建二叉树
- 已知二叉树的先序遍历(preorder)和中序遍历(inorder) 或 中序和后序(postorder),还原该二叉树
- 已知二叉树前序、后序遍历如何求中序
- 根据二叉树的前序遍历序列和中序遍历序列求二叉树的后序遍历序列
- hdu1710 已知二叉树的前序遍历和中序遍历,还原二叉树,求出后序、层次遍历
- 根据先序和中序或后序和中序建立二叉树及树的遍历
- 旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
- sdut oj2804 求二叉树的深度(根据中序以及后序遍历求树)
- 如何根据前序遍历和中序遍历重建二叉树
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- 如何根据前序遍历序列和中序遍历序列确定二叉树