已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)

[原]已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)

2014-4-22阅读508 评论0

今天参加暑期实习笔试,碰到这道题:二叉树的后序排列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肯定是根结点,所以DB的左子树结点。这里是叶子结点。再看看A的右子树后序EFC,中序是ECF,所以C是根结点,则EC的左结点,F是右结点。所以可以构造出此二叉树:


遇到这种题目,都可以用这种分段递归的方法解决,但是已知先序和后序,求中序这种就不确定,只能确定根结点,所以构造对此二叉树做先序排列。接下来是对其做先序线索化二叉树。

什么是线索化二叉树,结合这篇文章看下:

1.线索二叉树

回到刚才的问题,如何对这个二叉树作先序线索化呢?

首先我们知道先序遍历的情况下顺序应该是这样的:A->B->D->C->E->F

所以构建出来的线索化二叉树应该是这样的:


先序线索二叉树,它的左子结点指针指向它的后继,所以结点E的线索化指针应该指向F,即它的后继,这里有个问题,先序线索二叉树前驱为什么不好找?首先,先序线索二叉树的遍历顺序是根左右,及根总是第一个遍历的,所以对于它的左子结点,是下一个访问的结点,因为如果一个结点的左子结点如果为空,那么可以作为它后继结点的线索,即作为指向它下一个结点的线索指针,如图中D的后继是C,那么它的左子结点指针的标志位可以置1,表示指向下一个结点的线索指针。所以如果一个结点的分支结点是左子树,那么前驱是在它的双亲结点上,如果是右子树,那么前驱在它的左兄弟结点上,就像图中的C结点,它的后继是E,前驱是A,所以很难通过右结点指针找到前驱A。它只能访问直系后裔结点。与中序线索二叉树还是有区别的。

研究了线索二叉树一个晚上,感觉理解还是不深,有什么错误或者建议请批评指出。

最后吐槽一下写篇技术blog也不容易,CSDN一直说我有敏感词,不让发,搞了一个晚上后来不得不用断点调试的方式,一行一行的找,最后定为到第二行,然后再几个字几个字的找,坑爹有没有。。。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值