線索二叉樹的理解
轉自:http://blog.csdn.net/failure01/article/details/8672360
線索二叉樹分為五個域(域:裝資料的變數)
分別是 LchildLtag data Rtag Rchild
Ltag 和 Rtag 是一個標識變數,又稱為控指標
Ltag 控制(標識) Lchild 中的內容性質
Rtag 控制(標識) Rchild 中的內容性質
data 是存放這個結點實際的資料(使用者放進來的資料)
當 Ltag = 0 時
Lchild中存放的是指向左孩子的指標
當 Ltag = 1 時
Lchild中存放的是指向前驅的指標,前驅,後繼,後面再解釋
當 Rtag = 0 時
Rtag中存放的是指向右孩子的指標
當 Rtag = 1 時
Rtag中存放的是指向後繼的指標
二叉樹的遍歷有三種 先序遍歷、中序遍歷、後序遍歷
遍歷的意思在這裡通俗地解釋一下。
相當與你家裡有10個碗。你這些碗上面有標號,你從標號1 到 標號 10按照順序把碗洗一遍。這時候是遍歷了一次這些碗。不過你也可以從標號 1 到 標號 10 按照順序給這些碗放入白飯。對碗的處理就看你喜歡了。還有上面的按照順序。這個順序也是可以由你自己來定的。你想從 1 – 10 或者 10 - 1 或者先洗偶數標號的再洗奇數的碗也可以。說白了就是在一個集合中走了一遍,在走的過程中你對這個集合裡面的單元進行了某些處理。有點囉嗦。我們繼續。
線索二叉樹用的是 中序遍歷
如圖
中序遍歷:D、B、G、E、A、C、F、H (關於這些是怎麼出來的,看這篇文章)
什麼是前驅什麼是後繼: 其中 B 的前驅是 D 、 B 的後繼是 G
寫這篇文章的目的在於記錄下線索二叉樹中前驅後繼的查詢
查詢前驅演算法簡述
1. 當 p -> Ltag=1時,p->Lchild 指向 p 結點的前驅。
2. 當 p –> Ltag=0 時,p->Lchild 指向左孩子。
P 的前驅結點,是在中序遍歷 p 的左子樹中的最右側分枝中沒有孩子的結點。形象地說是p為根的左子樹中的“最右側最下端”結點。
查詢後繼演算法簡述
1. 當p->Rtag=1時,p->Rchild 指向 p 結點的後繼
2. 當p->Rtag=0時,p->Rchild 指向右孩子,於前驅相似,此時 p 的中序後繼結點為其右子樹的“最左側下端”的結點
下面是兩個查詢的程式碼描述
查詢前驅
void InPre(BiTNode *p, BItNOde *pre)
{
if(p->Ltag == 1) pre = p -> Lchild;
else
{
for(q=p->Lchild; q-Rtag == 0; q=q->Rchild);
pre = q;
}
}
查詢後繼
void InSucc(BiTNode *p, BiTNode *next)
{
if(p->Rtag == 1) next = p->Rchild;
else
{
for(q=Rtag->Rchild; q->Ltag; q=q->Lchild);
next = q;
}
}