[原]已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
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肯定是根结点,所以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一直说我有敏感词,不让发,搞了一个晚上后来不得不用断点调试的方式,一行一行的找,最后定为到第二行,然后再几个字几个字的找,坑爹有没有。。。