数据结构(二十四)线索二叉树

---恢复内容开始---

  一、线索二叉树的原理

  1.对于一个有n个结点的二叉链表,每个结点有指向左右孩子的两个指针域,所以一共是2n个指针域。而n个结点的二叉树一共有n-1条分支线数(除了根结点,其他每个结点都有一条分支线指向自己),也就是说,其实是存在2n - (n - 1) = n + 1个空指针域。

  2.在二叉链表上,只能知道每个结点指向其左右孩子结点的地址,而不知道遍历序列中某个结点的前驱是谁,后继是谁。要想知道,必须遍历一次。以后每次需要知道时,都必须先遍历一次。

  3.如果在创建时就记住这些前驱和后继,将会在时间上有很大的节省。可以利用n+1个空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的地址。把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树(Threaded Binary Tree)。

  4.线索二叉树,等于把一棵二叉树转变成了一个双向链表,这样插入和删除结点,查找某个结点都带来了方便。所以对二叉树以某种次序遍历使其变为线索二叉树的过程称作是线索化。

  5.为了分清,某一结点的lchild是指向它的左孩子还是指向前驱,rchild是指向它的右孩子还是指向后继。在每个结点增设两个标志域ltag和rtag,这两个标志域只存放布尔型变量,其占用空间要小于像lchild和rchild的指针变量。其中,ltag为0时指向该结点的左孩子,为1时指向该结点的右孩子。rtag同理。

  6.如果所用的二叉树需经常遍历或查找结点时需要某种遍历序列中的前驱和后继,那么采用线索二叉链表的存储结构就是非常不错的选择。

  7.以下面的线索二叉链表为例:(中序遍历序列为:HDIBJEAFCG)

  

  和双向链表结构一样,在线索二叉链表中添加一个头结点,并令其lchild域的指针指向二叉树的根结点,其rchild域的指针指向中序遍历时访问的最后一个结点(G)。同时,令二叉树的中序序列中第一个结点(H)的lchild域指针(没有前序结点,本来为null)和最后一个结点(G)的rchild域指针(没有后继结点,本来为null)均指向头结点。这样的好处就是,既可以从第一个结点起顺后继进行遍历,也可以从最后一个结点起顺前续遍历。

  二、

  三、线索二叉链表的Java代码实现:

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/BigJunOba/p/9221375.html