線索二叉樹的建立和遍歷

2021-07-25 04:02:47 字數 2189 閱讀 5874

基本概念:對於n個結點的二叉樹,在二叉鏈儲存結構中有n+1個空鏈域,利用這些空鏈域存放在某種遍歷次序下該結點的前驅結點和後繼結點的指標,這些指標稱為線索,加上線索的二叉樹稱為線索二叉樹,這種加上了線索的二叉鍊錶稱為線索鍊錶。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。

首先需要修改二叉樹節點的定義。如下:

typedef struct node

struct node *lchild;

int ltag;    //ltag=0 時lchild指向左孩子;ltag=1 時lchild指向前驅;

int data;    //資料域,型別可以自定義

int rtag;       //rtag=0 時rchild指向右孩子;rtag=1 時rchild指向後繼;

struct node *rchild;  

}bithrnodetype;

建立線索二叉樹,或者說對二叉樹線索化,其

實質就是將二叉鍊錶中的空指標改為指向前驅或後繼的線索。

由於前驅和後繼資訊只有在遍歷該二叉樹時才能得到,所以,線索化的過程就是在遍歷的過程中修改空指標的過程。在遍歷過程中,訪問結點的操作是檢查當前的左,右指標域是否為空,將它們改為指向前驅結點或後續結點的線索。為實現這一過程,設指標pre始終指向剛剛訪問的結點,即若指標p指向當前結點,則pre指向它的前驅,以便設線索。

另外,在對一棵二叉樹加線索時,必須首先申請乙個頭結點,建立頭結點與二叉樹的根結點的指向關係,對二叉樹線索化後,還需建立最後乙個結點與頭結點之間的線索。下面例子通過中序遍歷實現中序線索化:

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

bithrnodetype *pre;

bithrtree *inorderthr(bithrtree *t)

head->ltag=0;head->rtag=1;/*建立頭結點*/

head->rchild=head;/*右指標回指*/

if(!t)

head->lchild=head;/*若二叉樹為空,則左指標回指*/

else

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);/*右子樹線索化*/

}

}

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

由於充分利用了空指標域的空間(等於節省了空間),又保證了建立時的一次遍歷就可以終生受用後繼的資訊(意味著節省了時間)。所以在實際問題中,如果所用的二叉樹需要經過遍歷或查詢結點時需要某種遍歷序列中的前驅和後繼,那麼採用線索二叉鍊錶的儲存結構就是非常不錯的選擇。

本文參考了

二叉樹建立和遍歷

二叉樹建立遍歷規則 1.先序 根 左 右 2.中序 左 根 右 3.後序 左 右 根 二叉樹定義和輔助函式如下 struct node void visit int data int indata 先序建立二叉樹 struct node createbitree 先序建立乙個二叉樹 return t...

二叉樹建立和遍歷

include include 帶返回值建立二叉樹 最簡單方法 節點資料結構 struct bs node typedef struct bs node tree tree head,p,root 建立二元查詢樹 有返回值的可以不傳參 沒有的話如何傳參 輸入0代表到了某個葉子節點 tree crea...

二叉樹建立和遍歷

二叉樹建立遍歷規則 1.先序 根 左 右 2.中序 左 根 右 3.後序 左 右 根 二叉樹定義和輔助函式例如以下 struct node void visit int data int indata 先序建立二叉樹 struct node createbitree 先序建立乙個二叉樹 return...