数据结构学习日志之十二--线索二叉树

数据结构学习日志之十一里面我们知道,

有n个结点的二叉树共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。

遍历二叉树是以一定规则将二叉树中的结点排成一个线性序列。这实质上是对一个非线性结构进行线性化操作,使每个结点(除第一个和最后一个外),这些线性序列中有且仅有一个直接前驱和直接后继。

当二叉树链表做为存储结构时,只能找到结点的左、右孩子信息,而不能得到结点在任意序列里面的前驱和后继,这种信息只能在遍历的动态过程中才能得到。

我们假设结点有左子树,则其lchild域指示其左孩子,否则令lchild域指示其前驱,若结点有右子树,则其rchild域指示其右孩子,否则指示其后继

如图


以这种结点结构构成的儿茶链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针称为线索。加上线索的二叉树称之为线索二叉树。

这样,我们在线索二叉树上面遍历,只需要找到序列的第一个结点,依次找到其后继,直至为空而止。


如图,有了线索二叉树,我们对它遍历其实就是操作一个双向链表结构,时间复杂度为O(n),由于充分利用了空指针域的空间,又保证了创建时的一次遍历就可以终生受用后继的信息。所以在实际问题中,如果所用的二叉树需要经过比那里或查找结点时需要某种比那里序列中的前驱和后继,那么采用线索二叉链表的存储结构是非常不错的选择。

代码地址:https://github.com/chanbendong/DataStructure/blob/master/BiThrTree.c

猜你喜欢

转载自blog.csdn.net/chanbendong/article/details/80181538