1.定義在二叉樹的結點上加上線索的二叉樹稱為線索二叉樹,對二叉樹以某種遍歷方式(前序、中序、後序或層序)進行遍歷,使其變為線索二叉樹的過程稱為對二叉樹進行線索化。
2.本質二叉樹的遍歷實質上是對乙個非線性結構進行線性化的過程,它使得每個結點(除第乙個和最後乙個)在這些線性序列中有且僅有乙個直接前驅和直接後繼。但在二叉鍊錶儲存中,查詢其左、右孩子是方便的,其前驅和後繼只有在遍歷中得到。為了容易找到前驅和後繼,有兩種方法。一是在結點結構中增加向前和向後的指標,這種方法增加了儲存開銷,不可取;二是利用二叉樹的空鏈指標。
3.建立線索二叉樹線索二叉樹中的線索能記錄每個結點的前驅和後繼資訊。為了區別線索指標和孩子指標,在每個結點中設定兩個標誌ltag和rtag。
若二叉鍊錶採用以上所示結構,則相應的鍊錶稱為線索鍊錶,其中指向結點前驅、後繼的指標稱為線索。加上線索的二叉樹稱為線索二叉樹。
按某種次序將二叉樹線索化,實質上是在遍歷過程中用線索取代空指標。因此,若設指標p指向正在訪問的結點,則遍歷時設立乙個指標pre,使其始終指向剛剛訪問過的結點(即p所示結點的前驅結點),這樣就記下了遍歷過程中結點被訪問的先後關係。
在遍歷過程中,設指標p指向正在訪問的結點。
1)若p所指向的結點有空指標域,則將相應的標誌域置為1。
2)若pre != null且pre所指結點的rtag == 1,則令pre->rchild = p 。
3)若p所指向結點的ltag== 1,則令p->lchild = pre。
4)使pre指向剛剛訪問過的結點,則令pre = p。
用這種方法得到線索二叉樹,其線索並不完整。也就是說,部分結點的前驅和後繼資訊還需要通過進一步的運算來得到。
4.訪問線索二叉樹以中序線索二叉樹為例,令p指向樹中的某個結點,查詢p所指結點的後繼結點的方法:
1)若p->rtag == 1,則p->rchild即指向其後繼結點。
2)若p->rtag == 0,則p所指結點的中序後繼必然是其右子樹中進行中序遍歷得到的第乙個結點。也就是說,從p所指結點的右子樹的根結點出發,沿左孩子指標鏈向下查詢,直到找到乙個沒有左孩子的結點為止,這個結點就是p所指結點的直接後繼結點。
5.相關演算法
//pre為全域性變數
bitree *pre;
//通過中序遍歷進行中序線索化
void inthreading(bitree *p)
else
//後繼線索
if(p->rchild == null)
else
if(pre != null && pre->rtag == 1)
pre = p;
//遞迴右子樹線索化
inthreading(p->rchild);
}}//中序遍歷二叉樹t,並將其中序線索化
bitree *inorderthr(bitree *t)
else
return head;
}//求後繼
bitree *next(bitree *p)
else
return(q);
}}//求前驅
bitree *front(bitree *p)
else
return(q);}}
線索二叉樹 資料結構
按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...
資料結構(線索二叉樹)
線索二叉樹的前序,中序,後序 typedef struct nodenode 前序線索二叉樹 參照中序即可 void prethread node p,node pre if pre null pre rchild null pre p if p ltag 0 prethread p lchild,...
二叉樹的中序線索樹 資料結構 線索二叉樹
1.引入線索二叉樹 二叉樹的遍歷實質上是對乙個非線性結構實現線性化的過程,使每乙個節點 除第乙個和最後乙個外 在這些線性序列中有且僅有乙個直接前驅和直接後繼。但在二叉鍊錶儲存結構中,只能找到乙個節點的左 右孩子資訊,而不能直接得到節點在任一遍歷序列中的前驅和後繼資訊。這些資訊只有在遍歷的動態過程中才...