線索二叉樹

2022-09-19 07:54:09 字數 3220 閱讀 1743

n個結點的二叉鍊錶中含有n+1(2n-(n-1)=n+1)個空指標域。利用二叉鍊錶中的空指標域,存放指向結點在某種遍歷次序下的前趨和後繼結點的指標(這種附加的指標稱為"線索")。

線索二叉樹資料結構

二叉樹的遍歷本質上是將乙個複雜的非線性結構轉換為線性結構,使每個結點都有了唯一前驅和後繼(第乙個結點無前驅,最後乙個結點無後繼)。對於二叉樹的乙個結點,查詢其左右子女是方便的,其前驅後繼只有在遍歷中得到。為了容易找到前驅和後繼,有兩種方法。一是在結點結構中增加向前和向後的指標fwd和bkd,這種方法增加了儲存開銷,不可取;二是利用二叉樹的空鏈指標。現將二叉樹的結點結構重新定義如下:

lchild

ltag

data

rtag

rchild

其中:ltag=0 時lchild指向左子女;

ltag=1 時lchild指向前驅;

rtag=0 時rchild指向右子女;

rtag=1 時rchild指向後繼;

構建

建立線索二叉樹,或者說對二叉樹線索化,實質上就是遍歷一棵二叉樹。在遍歷過程中,訪問結點的操作是檢查當前的左,右指標域是否為空,將它們改為指向前驅結點或後續結點的線索。為實現這一過程,設指標pre始終指向剛剛訪問的結點,即若指標p指向當前結點,則pre指向它的前驅,以便設線索。

另外,在對一顆二叉樹加線索時,必須首先申請乙個頭結點,建立頭結點與二叉樹的根結點的指向關係,對二叉樹線索化後,還需建立最後乙個結點與頭結點之間的線索。

下面是建立中序二叉樹的遞迴演算法,其中pre為全域性變數。12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

voidinthreading(bithrtree*p);//預先宣告

bithrnodetype*pre;

bithrtree*inorderthr(bithrtree*t)

returnhead;

}

voidinthreading(bithrtree*p)

else

p->ltag=0;

if(p->rchild==null)

p->rtag=1;/*後驅線索*/

else

p->rtag=0;

if(pre!=null&&pre->rtag==1)

pre->rchild=p;

pre=p;

inthreading(p->rchild);/*右子樹線索化*/

}

}12

3456

78910

1112

1314

1516

1718

1920

21bithptr*pre=null;/*全程變數*/

voidinthread(bithptr*p)

if(p->rchild==null)

p->rtag=1;

if(pre!=null&&pre->rtag==1)

pre->rchild=p;

pre=p;/*前驅指向當前結點*/

if(p->rtag==0)

inthread(p->rchild);/*右子樹線索化*/

}

}

(1)中序線索二叉樹:若結點的ltag=1,lchild指向其前驅;否則,該結點的前驅是以該結點為根的左子樹上按中序遍歷的最後乙個結點。若rtag=1,rchild指向其後繼;否則,該結點的後繼是以該結點為根的右子樹上按中序遍歷的第乙個結點。

求後繼的演算法如下:12

3456

78910

1112

bithptr*inordernext(bithptr*p)

}

求前驅的演算法如下:12

3456

78910

1112

bithptr*inordernext(bithptr*p)

}

(2) 後序線索二叉樹:

在後序線索二叉樹中查詢結點*p的前驅:若結點*p無左子樹,則p->lchild指向其前驅;否則,若結點*p有左子樹,當其右子樹為空時,其左子樹的根(即p->lrchild)為其後序前驅。當其右子樹非空時,其右子樹的根(即p->rchild)為其後序前驅。

在後序線索二叉樹中查詢結點*p的後繼:若結點*p為根,則無後繼;若結點*p為其雙親的右孩子,則其後繼為其雙親;若結點*p為其雙親的左孩子,且雙親無右子女,則其後繼為其雙親;若結點*p為其雙親的左孩子,且雙親有右子女,則結點*p的後繼是其雙親的右子樹中按後序遍歷的第乙個結點。所以,求後序線索二叉樹中結點的後繼要知道其雙親的資訊,要使用棧,所以說後序線索二叉樹是不完善的。

(3)先序線索二叉樹:

在先序線索二叉樹中查詢結點的後繼較容易,而查詢前驅要知道其雙親的資訊,要使用棧,所以說先序線索二叉樹也是不完善的。

線索二叉樹

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