已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
2014-04-22 10:38
239 查看
今天参加暑期实习笔试,碰到这道题:二叉树的后序排列DBEFCA,中序排列DBAECF,那么对其做先序线索化二叉树,节点E的线索化指向节点?
当时没有思路,线索化二叉树都记不清了,这是经常考到的,所以回来查了下资料,重新思考了下题目,做下总结。
首先来了解下什么是先序,中序和后序。在树中对结点进行访问的时候,先序就是按顺序访问根结点、左结点、右结点。可以记为根左右;中序是先访问左结点,然后根结点,再右结点,可以记为左根右;中序是先访问左结点,根结点,右结点,可以记为左根右;
后序是访问左结点,右结点,根结点,可以记为左右根。具体可以去网上查一下一下,如下所示:
先序:A B D E C F
中序:D B E A F C
后序:D E B F C A
再来看下题目,二叉树的后序排列是D B E F C A,中序排列DBAECF,那么由于后序排列是左右根的顺序,所以后序排列的最后一个结点A肯定是根结点,然后再看看中序排列,左根右,所以在A左边的DB属于A的左子树,A右边的ECF属于右子树,我们再分别看这两个子树,先看DB,后序排列是DB,中序排列也是DB,同理,B肯定是根结点,所以D是B的左子树结点。这里是叶子结点。再看看A的右子树后序EFC,中序是ECF,所以C是根结点,则E是C的左结点,F是右结点。所以可以构造出此二叉树:
遇到这种题目,都可以用这种分段递归的方法解决,但是已知先序和后序,求中序这种就不确定,只能确定根结点,所以构造对此二叉树做先序排列。接下来是对其做先序线索化二叉树。
什么是线索化二叉树,结合这篇文章看下:
1.线索二叉树
回到刚才的问题,如何对这个二叉树作先序线索化呢?
首先我们知道先序遍历的情况下顺序应该是这样的:A->B->D->C->E->F
所以构建出来的线索化二叉树应该是这样的:
先序线索二叉树,它的左子结点指针指向它的后继,所以结点E的线索化指针应该指向F,即它的后继,这里有个问题,先序线索二叉树前驱为什么不好找?首先,先序线索二叉树的遍历顺序是根左右,及根总是第一个遍历的,所以对于它的左子结点,是下一个访问的结点,因为如果一个结点的左子结点如果为空,那么可以作为它后继结点的线索,即作为指向它下一个结点的线索指针,如图中D的后继是C,那么它的左子结点指针的标志位可以置1,表示指向下一个结点的线索指针。所以如果一个结点的分支结点是左子树,那么前驱是在它的双亲结点上,如果是右子树,那么前驱在它的左兄弟结点上,就像图中的C结点,它的后继是E,前驱是A,所以很难通过右结点指针找到前驱A。它只能访问直系后裔结点。与中序线索二叉树还是有区别的。
研究了线索二叉树一个晚上,感觉理解还是不深,有什么错误或者建议请批评指出。
最后吐槽一下写篇技术blog也不容易,CSDN一直说我有敏感词,不让发,搞了一个晚上后来不得不用断点调试的方式,一行一行的找,最后定为到第二行,然后再几个字几个字的找,坑爹有没有。。。
当时没有思路,线索化二叉树都记不清了,这是经常考到的,所以回来查了下资料,重新思考了下题目,做下总结。
首先来了解下什么是先序,中序和后序。在树中对结点进行访问的时候,先序就是按顺序访问根结点、左结点、右结点。可以记为根左右;中序是先访问左结点,然后根结点,再右结点,可以记为左根右;中序是先访问左结点,根结点,右结点,可以记为左根右;
后序是访问左结点,右结点,根结点,可以记为左右根。具体可以去网上查一下一下,如下所示:
先序:A B D E C F
中序:D B E A F C
后序:D E B F C A
再来看下题目,二叉树的后序排列是D B E F C A,中序排列DBAECF,那么由于后序排列是左右根的顺序,所以后序排列的最后一个结点A肯定是根结点,然后再看看中序排列,左根右,所以在A左边的DB属于A的左子树,A右边的ECF属于右子树,我们再分别看这两个子树,先看DB,后序排列是DB,中序排列也是DB,同理,B肯定是根结点,所以D是B的左子树结点。这里是叶子结点。再看看A的右子树后序EFC,中序是ECF,所以C是根结点,则E是C的左结点,F是右结点。所以可以构造出此二叉树:
遇到这种题目,都可以用这种分段递归的方法解决,但是已知先序和后序,求中序这种就不确定,只能确定根结点,所以构造对此二叉树做先序排列。接下来是对其做先序线索化二叉树。
什么是线索化二叉树,结合这篇文章看下:
1.线索二叉树
回到刚才的问题,如何对这个二叉树作先序线索化呢?
首先我们知道先序遍历的情况下顺序应该是这样的:A->B->D->C->E->F
所以构建出来的线索化二叉树应该是这样的:
先序线索二叉树,它的左子结点指针指向它的后继,所以结点E的线索化指针应该指向F,即它的后继,这里有个问题,先序线索二叉树前驱为什么不好找?首先,先序线索二叉树的遍历顺序是根左右,及根总是第一个遍历的,所以对于它的左子结点,是下一个访问的结点,因为如果一个结点的左子结点如果为空,那么可以作为它后继结点的线索,即作为指向它下一个结点的线索指针,如图中D的后继是C,那么它的左子结点指针的标志位可以置1,表示指向下一个结点的线索指针。所以如果一个结点的分支结点是左子树,那么前驱是在它的双亲结点上,如果是右子树,那么前驱在它的左兄弟结点上,就像图中的C结点,它的后继是E,前驱是A,所以很难通过右结点指针找到前驱A。它只能访问直系后裔结点。与中序线索二叉树还是有区别的。
研究了线索二叉树一个晚上,感觉理解还是不深,有什么错误或者建议请批评指出。
最后吐槽一下写篇技术blog也不容易,CSDN一直说我有敏感词,不让发,搞了一个晚上后来不得不用断点调试的方式,一行一行的找,最后定为到第二行,然后再几个字几个字的找,坑爹有没有。。。
相关文章推荐
- 已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
- 重建二叉树--已知一个二叉树的前、中序排列,重建出该二叉树。
- 关于二叉树的问题1-已知前序,中序求后序遍历
- 已知中序和先序,求二叉树的重构问题
- 剑指offer——已知二叉树的先序和中序排列,重构二叉树
- 已知二叉树的中序和后序遍历排列,求前序遍历
- 学习笔记——已知二叉树的先序中序求后序、中序后序求先序的遍历序列
- PAT 1020 已知中序后序,还原二叉树 (二叉树遍历问题)
- 已知二叉树的先序排列和中序排列,重构该二叉树,并输出该树的后序遍历
- 中序线索化 二叉树
- 已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出相应的二叉树
- 已知二叉树的前序和中序,重建二叉树_笔记
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- 先序递归构造二叉树 中序递归遍历二叉树
- 建立线索二叉链表结构,实现二叉树的中序线索化及中序线索二叉树的遍历算法
- 二叉树由先序和中序建树
- 二叉树线索化以及线索化的先序、中序、后序遍历
- 已知二叉树的前序和中序遍历,构建该二叉树
- 二叉树的先序中序后序递归非递归遍历,插入删除等操作
- 笔试常见问题之子网掩码计算和二叉树的前中后遍历