1. 程式人生 > >線索二叉樹的理解

線索二叉樹的理解

轉自: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;
	}
}