二叉樹的線索

2022-07-11 08:18:10 字數 1298 閱讀 2534

關於二叉樹的鍊錶,陣列等表示法,都存在乙個明顯更的缺點,無法直接訪問其每個節點的後繼和前驅。對於有一些資料的便利需求顯然是無法滿足的。因此就提出了二叉樹的線索這一方法。其核心就是在遍歷二叉樹的同時能直接對節點的前驅和後繼進行訪問操作。

二叉樹的線索具體做法是在每乙個二叉樹的的節點上面新增兩個額外的標籤ltag,rtag。利用二叉樹節點已有的左右孩子指標,在節點有孩子的情況下將tag標籤置為0(哪一側有就將對應側的標籤置為0),原來左右孩子指標依然指向各自的孩子不變;當節點無孩子時將tag標籤置為1(哪一側無就將哪一側對應得標籤置為1),並且將原來的孩子指標指向其前驅(ltag為1時)或後繼(rtag為1時)。這樣不僅能解決傳統二叉樹無法訪問其節點前驅後繼的問題還可以極大的利用二叉樹節點已有的資料空間。(任何乙個二叉樹節點的任何一側其tag標籤要麼為0要麼為1,二者只能選乙個,這是上述方法可行的基本條件)

//

二叉樹線索的資料結構

typedef enum pointertag;//

precusor==0:指標,succeed==1線索

我們來仔細分析一下二叉樹線索(以中序遍歷為例)的過程:如上圖由頭節點開始向下按t->lchild遍歷直到到達d節點然後開始輸出節點d的data此時d的rtag為1(succeed即列舉的第二個值).此時t->rchild指向的是該節點的後繼即為b節點然後輸出b節點的data。此時b的rtag變為0(precursor即為列舉的第乙個值)接著訪問e節點此時e的rtag為1,此時t->data為該節點的後繼即為a。以此方式遍歷整個二叉樹。

二叉樹線索的實現**:

1,非遞迴法

typedef struct

bitree p;

inorder(bitree t)

p=p->rchild;}}

}

2,遞迴呼叫法

typedef structbitree pre;
inorder(bitree t,bitree &thrt)  

if(thrt->lchild)

return 0;

} inthread(bitree p)

if(!pre-rchild)

pre=p;

intread(p->rchild);

}}

以上就是關於二叉樹線索的初步概括,水平有限!僅供學習參考用!

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...

線索二叉樹

當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在n個結點的二叉鍊...

線索二叉樹

1.線索二叉樹結構和操作定義 threadbintree.h 功能 線索標誌域所有值 typedef enumnodeflag 功能 線索二叉樹結構體 typedef struct threadtreethreadbintree 前驅節點指標 threadbintree previous null ...