數(shù)據(jù)結(jié)構(gòu)第講線索樹(shù)與樹(shù)和森林_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)第講線索樹(shù)與樹(shù)和森林_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)第講線索樹(shù)與樹(shù)和森林_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)第講線索樹(shù)與樹(shù)和森林_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)第講線索樹(shù)與樹(shù)和森林_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)第講線索樹(shù)與樹(shù)和森林第一頁(yè),共四十六頁(yè),2022年,8月28日6.3.2線索二叉樹(shù)1.何謂線索二叉樹(shù)?遍歷結(jié)果是求得結(jié)點(diǎn)的一個(gè)線性序列。指向該線性序列“前驅(qū)”和“后繼”的指針,稱“線索”;包含“線索”的存儲(chǔ)結(jié)構(gòu),稱為“線索鏈表”;與其相應(yīng)的二叉樹(shù),稱為“線索二叉樹(shù)”;對(duì)二叉樹(shù)以某種次序遍歷,使其變?yōu)榫€索二叉樹(shù)的過(guò)程,稱為“線索化”。第二頁(yè),共四十六頁(yè),2022年,8月28日2.線索鏈表中結(jié)點(diǎn)的結(jié)構(gòu)在二叉鏈表的結(jié)點(diǎn)結(jié)構(gòu)中增加兩個(gè)標(biāo)志域,并規(guī)定:lchildLTagdataRTagrchild其中:LTag=0lchild域指示結(jié)點(diǎn)的左孩子1lchild域指示結(jié)點(diǎn)的前驅(qū)RTag=0rchild域指示結(jié)點(diǎn)的右孩子1rchild域指示結(jié)點(diǎn)的后繼第三頁(yè),共四十六頁(yè),2022年,8月28日二叉樹(shù)二叉線索存儲(chǔ)表示typedefenum{Link,Thread}PointerThr;

//Link==0:指針,Thread==1:線索typedefstructBiThrNode{TElemTypedata;StructBiThrNode*lchild,*rchild;

//左右孩子指針

PointerThrLTag,RTag;//左右標(biāo)志}BiThrNode,*BiThrTree;第四頁(yè),共四十六頁(yè),2022年,8月28日3.線索二叉樹(shù)圖例線索二叉樹(shù)及其存儲(chǔ)結(jié)構(gòu)(a)中序線索二叉樹(shù)(b)中序線索鏈表1234567010020131141050161171thrt0

1第五頁(yè),共四十六頁(yè),2022年,8月28日如何在線索樹(shù)中找結(jié)點(diǎn)的后繼?結(jié)合中序線索樹(shù)若其右標(biāo)志為“1”,右鏈?zhǔn)蔷€索,右鏈直接指示了結(jié)點(diǎn)的后繼;若其右標(biāo)志為“0”,右鏈?zhǔn)侵羔?,其后繼為右子樹(shù)中最左下的結(jié)點(diǎn)。1234567第六頁(yè),共四十六頁(yè),2022年,8月28日如何在線索樹(shù)中找結(jié)點(diǎn)的前驅(qū)?結(jié)合中序線索樹(shù)

若其左標(biāo)志為“1”,左鏈為線索,直接指示其前驅(qū);若其左標(biāo)志為“0”,左子樹(shù)中最右下的結(jié)點(diǎn)為其前驅(qū)。1234567第七頁(yè),共四十六頁(yè),2022年,8月28日線索鏈表的中序遍歷算法StatusIOTraver_T(BiThrTreeT,Status(*Visit)(TElemTypee)){//T指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)的左鏈lchild指向根結(jié)點(diǎn),中序遍歷

//二叉線索樹(shù)T的非遞歸算法,對(duì)每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)Visit。p=T->lchild;//p指向根結(jié)點(diǎn)

while(p!=T){//空樹(shù)或遍歷結(jié)束時(shí),p==Twhile(p->LTag==Link)p=p->lchild;if(!Visit(p->data))returnERROR;//訪問(wèn)其左子樹(shù)為空的結(jié)點(diǎn)while(p->RTag==Thread&&p->rchild!=T){p=p->rchild;Visit(p->data);}//訪問(wèn)后繼結(jié)點(diǎn)p=p->rchild;}returnOK;}//IOTraver_T010020131141050161171T011第八頁(yè),共四十六頁(yè),2022年,8月28日4.如何建立線索化鏈表?由于線索化的實(shí)質(zhì)是將二叉鏈表中的空指針改為指向前驅(qū)或后繼的線索,而前驅(qū)或后繼的信息只有在遍歷時(shí)才能得到,因此線索化的過(guò)程即為在遍歷的過(guò)程中修改空指針的過(guò)程。第九頁(yè),共四十六頁(yè),2022年,8月28日對(duì)二叉鏈表p進(jìn)行中序線索化的遞歸算法(帶頭結(jié)點(diǎn))StatusInOrderThreading(BiThrTree&Thrt,BiThrTreeT)步驟:1.生成頭結(jié)點(diǎn)Thrt,如果樹(shù)非空,頭結(jié)點(diǎn)指向樹(shù)根,否則,回指自身;2.pre=Thrt;調(diào)用不帶頭結(jié)點(diǎn)的中序線索化的遞歸算法;3.最后一個(gè)結(jié)點(diǎn)線索化(指向頭結(jié)點(diǎn))第十頁(yè),共四十六頁(yè),2022年,8月28日voidInThreading(BiThrTreep){

if(p){

InThreading(p->lchild);

//左子樹(shù)線索化

if(!p->lchild){p->lchild=pre;p->ltag=Thread;}//前驅(qū)線索

if(!pre->rchild){pre->rchild=p;pre->rtag=Thread;}//后繼線索

pre=p;//保持pre指向p的前驅(qū)

InThreading(p->rchild);

//右子樹(shù)線索化

}}InThreading

對(duì)二叉鏈表p進(jìn)行中序線索化的遞歸算法(不帶頭結(jié)點(diǎn))0100203

4050

6

7

pre0

1p第十一頁(yè),共四十六頁(yè),2022年,8月28日StatusInOrderThreading(BiThrTree&Thrt,BiThrTreeT){//中序遍歷二叉樹(shù)T,并將其中序線索化,Thrt指向頭結(jié)點(diǎn)。

Thrt=(BiThrTree)malloc(sizeof(BiThrNode));if(!Thrt)exit(OVERFLOW);Thrt->ltag=Link;

Thrt->rtag=Thread;//建立頭結(jié)點(diǎn)

Thrt->rchild=Thrt;if(!T)Thrt->lchild=Thrt;//空樹(shù),左指針回指自身

else{//二叉樹(shù)不為空樹(shù),進(jìn)行線索化

Thrt->lchild=T;//頭結(jié)點(diǎn)的lchild指向二叉鏈表根

pre=Thrt;//pre指向前驅(qū)結(jié)點(diǎn)

InThreading(T);

//中序線索化二叉鏈表Tpre->rchild=Thrt;

pre->rtag=Thread;

//最后一個(gè)結(jié)點(diǎn)線索化

Thrt->rchild=pre;}returnOK;}第十二頁(yè),共四十六頁(yè),2022年,8月28日StatusInOrderThreading(BiThrTree&Thrt,BiThrTreeT){Thrt=(BiThrTree)malloc(sizeof(BiThrNode));

if(!Thrt)exit(OVERFLOW);Thrt->ltag=Link;Thrt->rtag=Thread;Thrt->rchild=Thrt;if(!T)Thrt->lchild=Thrt;//空樹(shù),Thrt回指自身

ThrtLinkThread第十三頁(yè),共四十六頁(yè),2022年,8月28日1else{Thrt->lchild=T;//頭結(jié)點(diǎn)的lchild指向二叉鏈表根

pre=Thrt;//pre指向前驅(qū)結(jié)點(diǎn)

InThreading(T);

//中序線索化二叉鏈表Tpre->rchild=Thrt;

pre->rtag=Thread;

//最后一個(gè)結(jié)點(diǎn)線索化

Thrt->rchild=pre;

}returnOK;}

ThrtABDCEpre輸出:BCAED10111110000preP=nullT第十四頁(yè),共四十六頁(yè),2022年,8月28日ABDECFG例:對(duì)下圖的樹(shù)按先序、后序、中序線索化第十五頁(yè),共四十六頁(yè),2022年,8月28日第6章樹(shù)和二叉樹(shù)6.1樹(shù)的定義和基本術(shù)語(yǔ)6.2二叉樹(shù)6.3遍歷二叉樹(shù)和線索二叉樹(shù)6.4樹(shù)和森林

6.4.1樹(shù)的存儲(chǔ)結(jié)構(gòu)6.4.2森林與二叉樹(shù)的轉(zhuǎn)換6.4.3樹(shù)和森林的遍歷6.6赫夫曼樹(shù)及其應(yīng)用第十六頁(yè),共四十六頁(yè),2022年,8月28日6.4.1樹(shù)的存儲(chǔ)結(jié)構(gòu)三種常用的鏈表結(jié)構(gòu):雙親表示法孩子表示法孩子兄弟表示法第十七頁(yè),共四十六頁(yè),2022年,8月28日1.

雙親表示法即以一組連續(xù)空間存儲(chǔ)樹(shù)的結(jié)點(diǎn),同時(shí)在每個(gè)結(jié)點(diǎn)中附設(shè)一個(gè)指示器指示其雙親結(jié)點(diǎn)在鏈表中的位置。DACREBFHGK雙親結(jié)點(diǎn)下標(biāo)9876543210666311000-1KHGFEDCBAR第十八頁(yè),共四十六頁(yè),2022年,8月28日樹(shù)的雙親表存儲(chǔ)表示#defineMAX_TREE_SIZE100typedefstructPTNode{//結(jié)點(diǎn)結(jié)構(gòu)

Elemdata;intparent;//雙親位置域}PTNode;typedefstruct{//樹(shù)結(jié)構(gòu)

PTNodenodes[MAX_TREE_SIZE];intr,n;//根結(jié)點(diǎn)的位置和結(jié)點(diǎn)個(gè)數(shù)}PTree;第十九頁(yè),共四十六頁(yè),2022年,8月28日分析:這種存儲(chǔ)結(jié)構(gòu)利用每個(gè)結(jié)點(diǎn)(除根結(jié)點(diǎn))只有唯一雙親的性質(zhì),Parent(T,x)操作可在常量時(shí)間內(nèi)實(shí)現(xiàn)。反復(fù)調(diào)用Parent操作,直到遇見(jiàn)無(wú)雙親的結(jié)點(diǎn)時(shí),便找到了樹(shù)的根。但在這種表示方式中,求結(jié)點(diǎn)的孩子時(shí)需遍歷整個(gè)結(jié)構(gòu)。第二十頁(yè),共四十六頁(yè),2022年,8月28日2.孩子表示法由于樹(shù)中每個(gè)結(jié)點(diǎn)可能有多棵子樹(shù),則考慮用多重鏈表,即結(jié)點(diǎn)有多個(gè)指針域,其中每個(gè)指針指向一棵子樹(shù)的根結(jié)點(diǎn),此時(shí)鏈表中的結(jié)點(diǎn)可以有如下兩種結(jié)點(diǎn)格式:datadegreechild1child2…childdydatachild1child2…childdx第二十一頁(yè),共四十六頁(yè),2022年,8月28日采用第一種格式多重鏈表中的結(jié)點(diǎn)是同構(gòu)的,其中dx為樹(shù)的度。由于樹(shù)中很多結(jié)點(diǎn)的度小于dx,所以鏈表中有很多空鏈域,造成空間浪費(fèi)。datachild1child2…childdx第二十二頁(yè),共四十六頁(yè),2022年,8月28日采用第二種格式

多重鏈表中的結(jié)點(diǎn)是不同構(gòu)的,其中

dy為結(jié)點(diǎn)的度,drgee

域的值同dy,此時(shí)可以節(jié)省存儲(chǔ)空間,但操作不方便。datadegreechild1child2…childdy第二十三頁(yè),共四十六頁(yè),2022年,8月28日有沒(méi)有既能節(jié)省空間又操作方便的辦法呢?第二十四頁(yè),共四十六頁(yè),2022年,8月28日另一種方式把每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來(lái),看成是一個(gè)線性表,且以單鏈表作存儲(chǔ)結(jié)構(gòu),則n個(gè)結(jié)點(diǎn)有n個(gè)孩子鏈表(葉子的孩子鏈表為空)。而n個(gè)頭指針又組成一個(gè)線性表,為便于查找,采用順序存儲(chǔ)結(jié)構(gòu)。第二十五頁(yè),共四十六頁(yè),2022年,8月28日3^6^51^2078^9^K^H^G^EFR^DC^BA0123456789DACREBFHGK第二十六頁(yè),共四十六頁(yè),2022年,8月28日樹(shù)的孩子鏈表存儲(chǔ)表示typedefstructCTNode

{//孩子結(jié)點(diǎn)intchild;structCTNode*next;}*ChildPtr;typedefstruct{//雙親結(jié)點(diǎn)結(jié)構(gòu)Elemdata;

ChildPtrfirstchild;//孩子鏈的頭指針}CTBox;typedefstruct{//樹(shù)結(jié)構(gòu):

CTBoxnodes[MAX_TREE_SIZE];intn,r;//結(jié)點(diǎn)數(shù)和根結(jié)點(diǎn)的位置}CTree;第二十七頁(yè),共四十六頁(yè),2022年,8月28日分析:與雙親表示法相反,孩子表示法便于涉及孩子的操作實(shí)現(xiàn),卻不適用于Parent(T,x)操作。可根據(jù)某種需要,將二者結(jié)合起來(lái),即帶雙親的孩子鏈表。第二十八頁(yè),共四十六頁(yè),2022年,8月28日3.孩子兄弟表示法或稱二叉樹(shù)表示法,或稱二叉鏈表表示法。即以二叉鏈表作樹(shù)的存儲(chǔ)結(jié)構(gòu)。鏈表中結(jié)點(diǎn)的兩個(gè)鏈域分別指向該結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn)。第二十九頁(yè),共四十六頁(yè),2022年,8月28日^R^E^^K^^C^FAB^G^H^D^DACREBFHGK3.孩子兄弟表示法例:第三十頁(yè),共四十六頁(yè),2022年,8月28日樹(shù)的二叉鏈表(孩子-兄弟)存儲(chǔ)表示typedefstructCSNode{Elemdata;structCSNode*firstchild,*nextsibling;}CSNode,*CSTree;第三十一頁(yè),共四十六頁(yè),2022年,8月28日分析:這種存儲(chǔ)結(jié)構(gòu)便于實(shí)現(xiàn)各種樹(shù)的操作。首先易于實(shí)現(xiàn)找結(jié)點(diǎn)孩子等的操作。如果為每個(gè)結(jié)點(diǎn)增設(shè)一個(gè)(parent)域,則同樣能方便地實(shí)現(xiàn)Parent(T,x)操作。第三十二頁(yè),共四十六頁(yè),2022年,8月28日6.4.2森林和二叉樹(shù)的轉(zhuǎn)換1.樹(shù)和二叉樹(shù)的對(duì)應(yīng)關(guān)系由于二叉樹(shù)和樹(shù)都可用二叉鏈表作為存儲(chǔ)結(jié)構(gòu),則以二叉鏈表作為媒介可導(dǎo)出樹(shù)與二叉樹(shù)之間的一個(gè)對(duì)應(yīng)關(guān)系。第三十三頁(yè),共四十六頁(yè),2022年,8月28日第三十四頁(yè),共四十六頁(yè),2022年,8月28日樹(shù)轉(zhuǎn)換為二叉樹(shù)方法:1)對(duì)每個(gè)孩子進(jìn)行從左到右的排序;2)在兄弟之間加一條連線;3)對(duì)每個(gè)結(jié)點(diǎn),除了左孩子外,去除其與其余孩子之間的聯(lián)系;4)以根結(jié)點(diǎn)為軸心,將整個(gè)樹(shù)順時(shí)針轉(zhuǎn)45°。第三十五頁(yè),共四十六頁(yè),2022年,8月28日ABCDEGHFIaABCDEGHFIbABCDEGHFIcABCDEGHFId第三十六頁(yè),共四十六頁(yè),2022年,8月28日2.森林和二叉樹(shù)的對(duì)應(yīng)關(guān)系從樹(shù)的二叉鏈表表示的定義可知,任何一棵和樹(shù)對(duì)應(yīng)的二叉樹(shù),其右子樹(shù)必空。若把森林中第二棵樹(shù)的根結(jié)點(diǎn)看成是第一棵樹(shù)的根結(jié)點(diǎn)的兄弟,則同樣可導(dǎo)出森林和二叉樹(shù)的對(duì)應(yīng)關(guān)系。第三十七頁(yè),共四十六頁(yè),2022年,8月28日第三十八頁(yè),共四十六頁(yè),2022年,8月28日BCDEGHFIaBCDEGHFIbBCDEGHFIcBCDEGHFId第三十九頁(yè),共四十六頁(yè),2022年,8月28日已知條件:森林和二叉樹(shù)的對(duì)應(yīng)關(guān)系設(shè)森林F=(T1,T2,…,Tn);T1=(root,t11,t12,…,t1m);

二叉樹(shù)B=(LBT,Node(root),RBT);由森林轉(zhuǎn)換成二叉樹(shù)的轉(zhuǎn)換規(guī)則為:若F=Φ,則B=Φ;否則,由Root(T1)對(duì)應(yīng)得到Node(root);

由(t11,t12,…,t1m)對(duì)應(yīng)得到LBT;

由(T2,T3,…,Tn)對(duì)應(yīng)得到RBT。由二叉樹(shù)轉(zhuǎn)換為森林的轉(zhuǎn)換規(guī)則為:若B=Φ,則F=Φ;否則,由Node(root)對(duì)應(yīng)得到Root(T1);

由LBT對(duì)應(yīng)得到(t11,t12,…,t1m);T1除根以外所構(gòu)成的森林由RBT對(duì)應(yīng)得到(T2,T3,…,Tn);除T1之外的森林第四十頁(yè),共四十六頁(yè),2022年,8月28日6.4.3樹(shù)和森林的遍歷1.樹(shù)的遍歷:有三條搜索路徑先根(序)遍歷:若樹(shù)不空,則先訪問(wèn)根結(jié)點(diǎn),然后依次先根遍歷各棵子樹(shù)。后根(序)遍歷:若樹(shù)不空,則先依次后根遍歷各棵子樹(shù),然后訪問(wèn)根結(jié)點(diǎn)。按層次遍歷:若樹(shù)不空,則自上而下自左至右訪問(wèn)樹(shù)中每個(gè)結(jié)點(diǎn)。第四十一頁(yè),共四十六頁(yè),2022年,8月28日例對(duì)樹(shù)進(jìn)行先根遍歷,獲得的先根序列是:對(duì)樹(shù)進(jìn)行后根遍歷,獲得的后根序列是:ABCDEGHFIABEFCDGH

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論