线索二叉树

来源:互联网 发布:龙珠gt战斗力官方数据 编辑:程序博客网 时间:2024/05/16 14:49

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


遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后续序列。
当以二叉链表作为存储结构时,只能找到结点的左右孩子信息,而不能直接得到结点在任一序列中的前驱和后继信息,这种信息只有在遍历的动态过程中才能得到。

如何保存这种在遍历过程中得到的信息呢?

一个最简单的方法是在每个节点上增加两个指针域,分别指示结点在遍历时得到的前驱和后继信息。显然,这样做使得结构的存储密度大大降低。

另一方面,存在有n个结点的二叉链表中必定存在n+1个空链域。

为什么会有n+1个空链域呢?

如果结点总数为n, n2为度为2的结点树,n1为度为1的结点数,n0为度为0的结点数。n=n0+n1+n2 且 遵循一个公式  n0=n2+1

假设空链域的个数为 x  , 以二叉链表的数据结构来说:

x = 2*n0 + 1*n1 即 叶子结点有左右两个空域,度为1的结点有左或者右域,度为2的结点没有多余的域!

x= n0+n1+n0 = n0 + n1 + n2 +1 = n + 1 故有 n+1个空链域

由此设想能否利用这些空链域来存放结点的前驱和后继的信息。把这种指向前驱和后继的指针称为线索,加上线索的二叉链表成为线索链表,相应的二叉树就称为线索二叉树(Threaded Binary Tree)


线索二叉树的数据结构为:增加了两个标志域 leftThread和rightThread


leftChild  leftThread   data   rightThread    rightChild


若leftThread=0,则leftChild为左子女指针,否则为前驱线索,同理rightThread


0 0
原创粉丝点击