普通的二叉樹有左右孩子兩個指標域,但是有些節點的這兩個域是空的,這樣就造成了空間的浪費。我們可以把左孩子指標域指向遍歷時此節點的上乙個節點,右孩子指標域指向遍歷時此節點的下乙個節點。
如這圖c,d,e,f都有空閒的指標域可以利用。
圖中的中序遍歷結果為4,2,5,1,6,3
打個比方此時線索化後e節點的左孩子指標域就可以放前驅b,右孩子指標域可以放後繼a
但是如果指標域可以放前驅後繼,也可以放樹本身連線的孩子節點,那我們怎麼才能知道什麼時候放的是遍歷順序前後的節點呢?因此需要設定flag變數來標識。
節點:
flag為0說明指向的是孩子,為1說明指向的是前驅或後繼。
class
node
線索化:具體的線索化可以根據不同的順序來寫,這裡採用中序遍歷。大體上和寫遍歷樹的**相同,但是這裡要乙個前驅節點pre。
public
static
void
threadednodes
(node node)
if(pre != null && pre.right == null)
//前驅節點變成當前節點
pre = node;
//線索化右子樹
threadednodes
(node.right)
;}
線索化遍歷:
/**
* 中序遍歷線索化
*/public
void
threadedinfix()
//此時左指標被線索化,先列印出此節點
system.out.
println
(node)
;//如果右指標指向的是後繼,則一邊往右追一邊列印,因為右指標本來就是指向中序輸出的下乙個節點
while
(node.rightflag ==1)
//如果右指標沒被線索化,則把node的右節點賦給node,繼續下一次迴圈
node = node.right;
}}
輸出結果:
node
node
node
node
node
node
中序查詢:按照同樣的思路可以寫出中序查詢
/**
* 中序查詢
* @param no
* @return
*/public node infixsearch
(int no)
線索化二叉樹以及遍歷線索化二叉樹
1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...
線索化二叉樹
define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...
線索化二叉樹
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.二叉樹的結...