線索二叉樹

2021-07-12 05:46:05 字數 1931 閱讀 1358

普通二叉樹只能找到結點的左右孩子資訊,而該結點的直接前驅和直接後繼只能在遍歷過程中獲得。 

若將遍歷後對應的有關前驅和後繼預存起來,則從第乙個結點開始就能很快「順藤摸瓜」而遍歷整個樹了。

例如中序遍歷結果:b d c e a f h g,實際上已將二叉樹轉為線性排列,顯然具有唯一前驅和唯一後繼。

1. 線索二叉樹的定義

規定:

1)若結點有左子樹,則lchild指向其左孩子;否則, lchild指向其直接前驅(即線索);

2)若結點有右子樹,則rchild指向其右孩子;否則, rchild指向其直接後繼(即線索) 。

為區別兩種不同情況,特增加兩個標誌域(各1bit)

約定:

當tag域為0時,表示正常情況;

當tag域為1時,表示線索情況.

有關線索二叉樹的幾個術語:

線索鍊錶:用含tag的結點樣式所構成的二叉鍊錶         

線   索:指向結點前驅和後繼的指標 

線索二叉樹:加上線索的二叉樹  

線    索   化:對二叉樹以某種次序遍歷使其變為線索二叉樹的過程

增加了前驅和後繼等線索有什麼好處? ——能方便找出當前結點的前驅和後繼,不用堆疊也能遍歷整個樹。

線索二叉樹的生成:

線索化過程就是在遍歷過程中修改空指標的過程: 將空的lchild改為結點的直接前驅; 將空的rchild改為結點的直接後繼。

非空指標仍然指向孩子結點(稱為「正常情況」)

線索二叉樹的生成演算法:

目的:在依某種順序遍歷二叉樹時修改空指標,新增前驅或後繼。 

註解:為方便新增結點的前驅或後繼,需要設定兩個指標:p指標→當前結點之指標;  pre指標→前驅結點之指標。

技巧:當結點p的左、右域均空時,只改寫它的左域(裝入前驅pre),而其右域(後繼)留給下一結點來填寫。或者說,當前結點的指標p應當送到前驅結點的空右域中。 

若p->lchild=null,則//p的前驅結點指標pre存入左空域 

若pre->rchild=null, 則 //p存入其前驅結點pre的右空域

線索二叉樹的遍歷

理論上,只要找到序列中的第乙個結點,然後依次訪問結點的後繼直到後繼為空時結束。

以中序線索二叉樹為例: 對葉子結點(rtag=1),直接後繼指標就在其rchild域內; 對其他結點(rtag=0),直接後繼是其右子樹最左下的結點; (因為中序遍歷規則是ldr,先左再根再右)

線索二叉樹

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

線索二叉樹

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

線索二叉樹

原始碼 中序線索二叉樹 author 菜鳥 version 2014.7.23 include include include typedef char datatype using namespace std 定義線索二叉樹的結構體 typedef struct nodethreadbitreen...