對於具有n個結點的二叉樹,二叉鍊錶中空的指標域數目為n+1,如下圖:
注:n+1 的推導過程如下:2*n - (n-1) = n+1
利用二叉鍊錶中空的指標域指出結點在某種遍歷序列中的直接前驅或直接後繼。指向前驅和後繼的指標稱為線索,加了線索的二叉樹稱為線索二叉樹。
利用鏈結點的空的左指標域存放該結點的直接前驅的位址,空的右指標域存放該結點直接後繼的位址;而非空的指標域仍然存放結點的左孩子或右孩子的位址。
指標與線索的區分方法
法一:
本文採用第一種方法。
線索二叉樹鏈結點型別定義
c語言的線索二叉樹鏈結點型別定義為:
typedef
struct node tbtnode,
*tbtree;
約定:序列中的頭和尾的直接前驅和直接後繼線索均指向頭結點;
以中序序列為例,一顆完整的中序線索二叉樹如下圖:
中序序列為:d, b, j, e, a, h, f, i, c, g
線索二叉樹的建立
線索二叉樹建立的主旨思想為在遍歷過程中建立線索,以下以中序序列為例,如下圖:
中序序列為:b,d,a,e,c
建立如下指標:
prior: 指向前一次訪問結點;
p: 指向當前訪問結點;
則建立線索的規律如下:
1、若當前訪問的結點的左指標域為空,則左指標域指向prior指的結點,同時置lbit為0,否則,置lbit為1;
2、若prior所指結點的右指標域為空,則右指標域指向當前訪問的結點,同時置rbit為0,否則,置rbit為1;
3、遍歷結束時,將prior->rchild指向頭結點,並置prior->rbit為0。
基於上述規律,得到c語言的演算法實現如下:
線索二叉樹的主要應用:確定某一結點的直接前驅和直接後繼。
以下,以在中序線索二叉樹中確定位址為x的結點的直接後繼為例。
演算法規律如下:
1、當x->rbit=0時,x->rchild指出的結點就是x的直接後繼結點;
2、當x->rbit=1時,沿著x的右子樹的根的左子樹方向查詢,直到某結點的 lchild域為線索時(該結點的lbit=0),此結點就是x結點直接後繼結點。
該演算法的c語言實現如下:
tbtree insucc
(tbtree x)
基於上述演算法,二叉樹的中序遍歷可以做些改進,如下:
二叉樹 三 線索化二叉樹
1.1 先看乙個問題 將數列 構建成一顆二叉樹.問題分析 當我們對上面的二叉樹進行中序遍歷時,數列為 但是 6,8,10,14 這幾個節點的 左右指標,並沒有完全的利用上.如果我們希望充分的利用 各個節點的左右指標,讓各個節點可以指向自己的前後節點,怎麼辦?解決方案 線索二叉樹 1.2 線索二叉樹基...
二叉樹之 線索二叉樹
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊 對於n個結...
樹 二叉樹 線索二叉樹
一 線索二叉樹 1 什麼是線索化 將二叉樹以某種次序將其遍歷,得到線性序列,就是將非線性結構進行線索化。線索化的優點就是可以很快地得到前驅或後繼。如果儲存線索化的線性序列 儲存二叉樹地線索化序列的其中一種方法就是在結點上加兩個指標,乙個指向前驅乙個指向後繼,這樣的缺點就是儲存密度大大降低。另一種方法...