數(shù)據(jù)結(jié)構(gòu)五樹(shù)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)五樹(shù)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)五樹(shù)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)五樹(shù)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)五樹(shù)_第5頁(yè)
已閱讀5頁(yè),還剩97頁(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)介

1、第五章 樹(shù) 樹(shù)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),是以分支關(guān)系定義的層次結(jié)構(gòu)5.1 樹(shù)的定義定義定義:樹(shù)(tree)是n(n0)個(gè)結(jié)點(diǎn)的有限集T,其中:有且僅有一個(gè)特定的結(jié)點(diǎn),稱為樹(shù)的根(root)當(dāng)n1時(shí),其余結(jié)點(diǎn)可分為m(m0)個(gè)互不相交的有限集T1,T2,Tm,其中每一個(gè)集合本身又是一棵樹(shù),稱為根的子樹(shù)(subtree)特點(diǎn):樹(shù)中至少有一個(gè)結(jié)點(diǎn)根樹(shù)中各子樹(shù)是互不相交的集合A只有根結(jié)點(diǎn)的樹(shù)ABCDEFGHIJKLM有子樹(shù)的樹(shù)根子樹(shù)基本術(shù)語(yǔ)結(jié)點(diǎn)(node)表示樹(shù)中的元素,包括數(shù)據(jù)項(xiàng)及若干指向其子樹(shù)的分支結(jié)點(diǎn)的度(degree)結(jié)點(diǎn)擁有的子樹(shù)數(shù)葉子(leaf)度為0的結(jié)點(diǎn)孩子(child)結(jié)點(diǎn)子樹(shù)的根

2、稱為該結(jié)點(diǎn)的孩子雙親(parents)孩子結(jié)點(diǎn)的上層結(jié)點(diǎn)叫該結(jié)點(diǎn)的兄弟(sibling)同一雙親的孩子樹(shù)的度一棵樹(shù)中最大的結(jié)點(diǎn)度數(shù)結(jié)點(diǎn)的層次(level)從根結(jié)點(diǎn)算起,根為第一層,它的孩子為第二層深度(depth)樹(shù)中結(jié)點(diǎn)的最大層次數(shù)森林(forest)m(m0)棵互不相交的樹(shù)的集合ABCDEFGHIJKLM結(jié)點(diǎn)A的度:3結(jié)點(diǎn)B的度:2結(jié)點(diǎn)M的度:0葉子:K,L,F(xiàn),G,M,I,J結(jié)點(diǎn)A的孩子:B,C,D結(jié)點(diǎn)B的孩子:E,F(xiàn)結(jié)點(diǎn)I的雙親:D結(jié)點(diǎn)L的雙親:E結(jié)點(diǎn)B,C,D為兄弟結(jié)點(diǎn)K,L為兄弟樹(shù)的度:3結(jié)點(diǎn)A的層次:1結(jié)點(diǎn)M的層次:4樹(shù)的深度:4結(jié)點(diǎn)F,G為堂兄弟結(jié)點(diǎn)A是結(jié)點(diǎn)F,G的祖先5.2

3、二叉樹(shù)定義定義:二叉樹(shù)是n(n0)個(gè)結(jié)點(diǎn)的有限集,它或?yàn)榭諛?shù)(n=0),或由一個(gè)根結(jié)點(diǎn)和兩棵分別稱為左子樹(shù)和右子樹(shù)的互不相交的二叉樹(shù)構(gòu)成特點(diǎn)每個(gè)結(jié)點(diǎn)至多有二棵子樹(shù)(即不存在度大于2的結(jié)點(diǎn))二叉樹(shù)的子樹(shù)有左、右之分,且其次序不能任意顛倒基本形態(tài)A只有根結(jié)點(diǎn)的二叉樹(shù)空二叉樹(shù)AB右子樹(shù)為空AB左子樹(shù)為空ABC左、右子樹(shù)均非空二叉樹(shù)性質(zhì)性質(zhì)1:) 1(21iii個(gè)結(jié)點(diǎn)層上至多有在二叉樹(shù)的第證明:用歸納法證明之 i=1時(shí),只有一個(gè)根結(jié)點(diǎn), 是對(duì)的 假設(shè)對(duì)所有j(1j1,則其雙親是i/2u (2) 如果2in,則結(jié)點(diǎn)i無(wú)左孩子;如果2in,則其左孩子是2iu (3) 如果2i+1n,則結(jié)點(diǎn)i無(wú)右孩子;如果

4、2i+1n,則其右孩子是2i+15.3 樹(shù)的存儲(chǔ)結(jié)構(gòu)樹(shù)的存儲(chǔ)結(jié)構(gòu)雙親表示法實(shí)現(xiàn):定義結(jié)構(gòu)數(shù)組存放樹(shù)的結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)含兩個(gè)域:數(shù)據(jù)域:存放結(jié)點(diǎn)本身信息雙親域:指示本結(jié)點(diǎn)的雙親結(jié)點(diǎn)在數(shù)組中位置特點(diǎn):找雙親容易,找孩子難typedef struct node datatype data; int parent;JD;JD tM;abcdefhgiacdefghib012235551096012345789dataparent0號(hào)單元不用或存結(jié)點(diǎn)個(gè)數(shù)如何找孩子結(jié)點(diǎn)v孩子表示法v多重鏈表:每個(gè)結(jié)點(diǎn)有多個(gè)指針域,分別指向其子樹(shù)的根v結(jié)點(diǎn)同構(gòu):結(jié)點(diǎn)的指針個(gè)數(shù)相等,為樹(shù)的度Dv結(jié)點(diǎn)不同構(gòu):結(jié)點(diǎn)指針個(gè)數(shù)不等,為

5、該結(jié)點(diǎn)的度ddata child1 child2 . childDdata degree child1 child2 . childdl孩子鏈表:每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)用單鏈表存儲(chǔ),再用含n個(gè)元素的結(jié)構(gòu)數(shù)組指向每個(gè)孩子鏈表孩子結(jié)點(diǎn):typedef struct node int child; /該結(jié)點(diǎn)在表頭數(shù)組中下標(biāo) struct node *next; /指向下一孩子結(jié)點(diǎn) JD;表頭結(jié)點(diǎn):typedef struct tnode datatype data; /數(shù)據(jù)域 struct node *fc; /指向第一個(gè)孩子結(jié)點(diǎn) TD; TD tM; /t0不用abcdefhgi6012345789a

6、cdefghibdatafc 2 3 4 5 9 7 8 6如何找雙親結(jié)點(diǎn)l帶雙親的孩子鏈表612345789acdefghibdatafc 2 3 4 5 9 7 8 6012235551parentabcdefhgiv孩子兄弟表示法(二叉樹(shù)表示法)v實(shí)現(xiàn):用二叉鏈表作樹(shù)的存儲(chǔ)結(jié)構(gòu),鏈表中每個(gè)結(jié)點(diǎn)的兩個(gè)指針域分別指向其第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn)v特點(diǎn)v操作容易v破壞了樹(shù)的層次typedef struct node datatype data; struct node *fch, *nsib;JD;abcdefhgi a b c d e f g h i二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)順序存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn):按滿

7、二叉樹(shù)的結(jié)點(diǎn)層次編號(hào),依次存放二叉樹(shù)中的數(shù)據(jù)元素特點(diǎn):結(jié)點(diǎn)間關(guān)系蘊(yùn)含在其存儲(chǔ)位置中浪費(fèi)空間,適于存滿二叉樹(shù)和完全二叉樹(shù)abcdefga b c d e 0 0 0 0 f g 1 2 3 4 5 6 7 8 9 10 11v鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)v二叉鏈表typedef struct node datatype data; struct node *lchild, *rchild;JD;lchild data rchild ABCDEFG在n個(gè)結(jié)點(diǎn)的二叉鏈表中,有n+1個(gè)空指針域 AB C D E F Gl三叉鏈表typedef struct node datatype data; struct nod

8、e *lchild, *rchild, *parent;JD;lchild data parent rchildABCDEFG A B C D E F G樹(shù)與二叉樹(shù)轉(zhuǎn)換ACBED樹(shù)ABCDE二叉樹(shù) A B C D E A B C D E A B C D E 對(duì)應(yīng)存儲(chǔ)存儲(chǔ)解釋解釋v將樹(shù)轉(zhuǎn)換成二叉樹(shù)v加線:在兄弟之間加一連線v抹線:對(duì)每個(gè)結(jié)點(diǎn),除了其左孩子外,去除其與其余孩子之間的關(guān)系v旋轉(zhuǎn):以樹(shù)的根結(jié)點(diǎn)為軸心,將整樹(shù)順時(shí)針轉(zhuǎn)45ABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHI樹(shù)轉(zhuǎn)換成的二叉樹(shù)其右子樹(shù)一定為空v將二叉樹(shù)轉(zhuǎn)換成樹(shù)v加線:若p結(jié)點(diǎn)是雙親結(jié)點(diǎn)的左

9、孩子,則將p的右孩子,右孩子的右孩子,沿分支找到的所有右孩子,都與p的雙親用線連起來(lái)v抹線:抹掉原二叉樹(shù)中雙親與右孩子之間的連線v調(diào)整:將結(jié)點(diǎn)按層次排列,形成樹(shù)結(jié)構(gòu)ABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHIv森林轉(zhuǎn)換成二叉樹(shù)v將各棵樹(shù)分別轉(zhuǎn)換成二叉樹(shù)v將每棵樹(shù)的根結(jié)點(diǎn)用線相連v以第一棵樹(shù)根結(jié)點(diǎn)為二叉樹(shù)的根,再以根結(jié)點(diǎn)為軸心,順時(shí)針旋轉(zhuǎn),構(gòu)成二叉樹(shù)型結(jié)構(gòu)ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJv二叉樹(shù)轉(zhuǎn)換成森林v抹線:將二叉樹(shù)中根結(jié)點(diǎn)與其右孩子連線,及沿右分支搜索到的所有右孩子間連線全部抹掉,使之變成孤立的二

10、叉樹(shù)v還原:將孤立的二叉樹(shù)還原成樹(shù)ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ5.4 樹(shù)和二叉樹(shù)的遍歷樹(shù)的遍歷遍歷按一定規(guī)律走遍樹(shù)的各個(gè)頂點(diǎn),且使每一頂點(diǎn)僅被訪問(wèn)一次,即找一個(gè)完整而有規(guī)律的走法,以得到樹(shù)中所有結(jié)點(diǎn)的一個(gè)線性排列常用方法先根(序)遍歷:先訪問(wèn)樹(shù)的根結(jié)點(diǎn),然后依次先根遍歷根的每棵子樹(shù)后根(序)遍歷:先依次后根遍歷每棵子樹(shù),然后訪問(wèn)根結(jié)點(diǎn)按層次遍歷:先訪問(wèn)第一層上的結(jié)點(diǎn),然后依次遍歷第二層,第n層的結(jié)點(diǎn)ABCDEFGHIJKLMNO先序遍歷:后序遍歷:層次遍歷:ABE F I GCDHJ KL NOME I F G B C J K N O L M

11、 H D AAB C DE F GH I J KL MNO二叉樹(shù)的遍歷方法先序遍歷:先訪問(wèn)根結(jié)點(diǎn),然后分別先序遍歷左子樹(shù)、右子樹(shù)中序遍歷:先中序遍歷左子樹(shù),然后訪問(wèn)根結(jié)點(diǎn),最后中序遍歷右子樹(shù)后序遍歷:先后序遍歷左、右子樹(shù),然后訪問(wèn)根結(jié)點(diǎn)按層次遍歷:從上到下、從左到右訪問(wèn)各結(jié)點(diǎn)DLRLDR、LRD、DLRRDL、RLD、DRLADBCD L RAD L RD L RBDCD L R先序遍歷序列:A B D C先序遍歷:ADBCL D RBL D RL D RADCL D R中序遍歷序列:B D A C中序遍歷:ADBC L R DL R DL R DADCL R D后序遍歷序列: D B C A

12、后序遍歷:B-+/a*b-efcd先序遍歷:中序遍歷:后序遍歷:層次遍歷:- + a * b - c d / e f-+a*b-cd/ef- +a *b - c d/e f-+a*b-c d/e fv算法v遞歸算法Ch5_1.cvoid preorder(JD *bt) if(bt!=NULL) printf(%dt,bt-data); preorder(bt-lchild); preorder(bt-rchild); 主程序主程序Pre( T )返回返回pre(T R);返回返回pre(T R);ACBDTBprintf(B);pre(T L);BTAprintf(A);pre(T L);A

13、TDprintf(D);pre(T L);DTCprintf(C);pre(T L);C返回T左是空返回pre(T R);T左是空返回T右是空返回T左是空返回T右是空返回pre(T R);先序序列:A B D Cl非遞歸算法ABCDEFGpiP-A(1)ABCDEFGpiP-AP-B(2)ABCDEFGpiP-AP-BP-C(3)p=NULLABCDEFGiP-AP-B訪問(wèn):C(4)pABCDEFGiP-A訪問(wèn):C B(5)ABCDEFGiP-AP-D訪問(wèn):C Bp(6)ABCDEFGiP-AP-DP-E訪問(wèn):C Bp(7)ABCDEFGiP-AP-D訪問(wèn):C B Ep(8)ABCDEFGiP

14、-AP-DP-G訪問(wèn):C B EP=NULL(9)ABCDEFGiP-A訪問(wèn):C B E G Dp(11)ABCDEFGiP-AP-F訪問(wèn):C B E G Dp(12)ABCDEFGiP-AP-D訪問(wèn):C B E Gp(10)ABCDEFGiP-A訪問(wèn):C B E G D Fp=NULL(13)ABCDEFGi訪問(wèn):C B E G D F Ap(14)ABCDEFGi訪問(wèn):C B E G D F Ap=NULL(15)遍歷非遞歸算法v層次遍歷算法層次遍歷 構(gòu)造二叉樹(shù)1. 先根和中根序列表示 從前面討論的二叉樹(shù)的遍歷知道,任意一棵二叉樹(shù)結(jié)點(diǎn)的先根序列和中根序列都是唯一的。反過(guò)來(lái),若已知結(jié)點(diǎn)的先根

15、序列和中根序列,能否確定這棵二叉樹(shù)呢?這樣確定的二叉樹(shù)是否是唯一的呢?回答是肯定的。 構(gòu)造二叉樹(shù)先根和中根序列表示 二叉樹(shù)的先根遍歷是先訪問(wèn)根結(jié)點(diǎn),其次再按先根遍歷方式遍歷根結(jié)點(diǎn)的左子樹(shù),最后按先根遍歷方式遍歷根結(jié)點(diǎn)的右子樹(shù)。這就是說(shuō),在先序序列中,第一個(gè)結(jié)點(diǎn)一定是二叉樹(shù)的根結(jié)點(diǎn)。另一方面,中根遍歷是先遍歷左子樹(shù),然后訪問(wèn)根結(jié)點(diǎn),最后再遍歷右子樹(shù)。這樣,根結(jié)點(diǎn)在中序序列中必然將中序序列分割成兩個(gè)子序列,前一個(gè)子序列是根結(jié)點(diǎn)的左子樹(shù)的中根序列,而后一個(gè)子序列是根結(jié)點(diǎn)的右子樹(shù)的中根序列。根據(jù)這兩個(gè)子序列,在先根序列中找到對(duì)應(yīng)的左子序列和右子序列。在先根序列中,左子序列的第一個(gè)結(jié)點(diǎn)是左子樹(shù)的根結(jié)點(diǎn),

16、右子序列的第一個(gè)結(jié)點(diǎn)是右子樹(shù)的根結(jié)點(diǎn)。這樣,就確定了二叉樹(shù)的三個(gè)結(jié)點(diǎn)。同時(shí),左子樹(shù)和右子樹(shù)的根結(jié)點(diǎn)又可以分別把左子序列和右子序列劃分成兩個(gè)子序列。 構(gòu)造二叉樹(shù)先根和中根序列表示 構(gòu)造二叉樹(shù) 同樣的道理,由二叉樹(shù)的后根序列和中根序列也可唯一地確定一棵二叉樹(shù)。 但是,由二叉樹(shù)的前根序列和后根序列卻不能唯一地確定一棵二叉樹(shù)。為什么? v構(gòu)造二叉樹(shù)v2. 按先序遍歷序列建立二叉樹(shù)的二叉鏈表v 已知先序序列為(標(biāo)明空子樹(shù)):v A B C . . D E . G . . F . . .ABCDEFG A B C D E F G v遍歷算法應(yīng)用l求二叉樹(shù)深度算法ABCDEFG A B C D E F G

17、l統(tǒng)計(jì)二叉樹(shù)中葉子結(jié)點(diǎn)個(gè)數(shù)算法5.5 二叉樹(shù)的應(yīng)用哈夫曼樹(shù)(Huffman)帶權(quán)路徑長(zhǎng)度最短的樹(shù)例:編制一個(gè)將百分制轉(zhuǎn)換為五級(jí)分制的程序。顯然,此程序很簡(jiǎn)單,只要利用條件語(yǔ)句便可完成: if (a60) b=”bad”; else if (a70) b=”pass”; else if (a80) b=”general”; e l s e i f ( a 9 0 ) b=”good”; else b=”excellent”; 這個(gè)判定過(guò)程可以下圖所示的判定樹(shù)來(lái)表示。如果上述程序需反復(fù)使用,而且每次的輸入量很大,則應(yīng)考慮上述程序的質(zhì)量問(wèn)題,即其操作所需要的時(shí)間。因?yàn)樵趯?shí)際中,學(xué)生的成績(jī)?cè)谖鍌€(gè)等級(jí)上

18、的分布是不均勻的。60b=“bad”tf70b=“pass”8090b=“general”b=“good” b=“excellent”fffttt假設(shè)其分布規(guī)律如下表所示: 分?jǐn)?shù) 059 6069 7079 8089 90100比 例 數(shù) 0 . 0 5 0 . 1 5 0.40 0.30 0.10則80的數(shù)據(jù)需進(jìn)行三次或三次以上的比較才能得出結(jié)果。假定以5,15,40,30和10為權(quán)構(gòu)造一棵有五個(gè)葉子結(jié)點(diǎn)的哈夫曼樹(shù)(即重新安排比較的順序),則可使大部分的數(shù)據(jù)經(jīng)過(guò)較少的比較次數(shù)得出結(jié)果。70b=“bad”tfb=“pass”6090b=“general”b=“good”b=“excellent

19、”ffftt80tn 假設(shè)有10000個(gè)輸入數(shù)據(jù),若按圖1的判定過(guò)程進(jìn)行操作,則總共需進(jìn)行31500次比較;而若按圖2的判定過(guò)程進(jìn)行操作,則總共僅需進(jìn)行22000次比較。n 分?jǐn)?shù) 059 6069 7079 8089 90100n 比例數(shù) 0.05 0.15 0.40 0.30 0.10n 個(gè)數(shù) 500 1500 4000 3000 1000n 比較數(shù)a 500 3000 12000 12000 4000n 比較數(shù)b1500 4500 8000 6000 20005.5 二叉樹(shù)的應(yīng)用哈夫曼樹(shù)(Huffman)帶權(quán)路徑長(zhǎng)度最短的樹(shù)定義路徑:從樹(shù)中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的分支構(gòu)成這兩個(gè)結(jié)點(diǎn)間的路

20、徑長(zhǎng)度:路徑上的分支數(shù)樹(shù)的路徑長(zhǎng)度:從樹(shù)根到每一個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和樹(shù)的帶權(quán)路徑長(zhǎng)度:樹(shù)中所有帶權(quán)結(jié)點(diǎn)的路徑長(zhǎng)度之和結(jié)點(diǎn)到根的路徑長(zhǎng)度權(quán)值其中:記作:kknkkklwlwwpl1lHuffman樹(shù)設(shè)有n個(gè)權(quán)值w1,w2,wn,構(gòu)造一棵有n個(gè)葉子結(jié)點(diǎn)的二叉樹(shù),每個(gè)葉子的權(quán)值為wi,則wpl最小的二叉樹(shù)叫例 有4個(gè)結(jié)點(diǎn),權(quán)值分別為7,5,2,4,構(gòu)造有4個(gè)葉子結(jié)點(diǎn)的二叉樹(shù)abcd7524WPL=7*2+5*2+2*2+4*2=36dcab2475WPL=7*3+5*3+2*1+4*2=46abcd7524WPL=7*1+5*2+2*3+4*3=35nkKKLWWPL1v構(gòu)造Huffman樹(shù)的方法H

21、uffman算法v構(gòu)造Huffman樹(shù)步驟v根據(jù)給定的n個(gè)權(quán)值w1,w2,wn,構(gòu)造n棵只有根結(jié)點(diǎn)的二叉樹(shù),令起權(quán)值為wjv在森林中選取兩棵根結(jié)點(diǎn)權(quán)值最小的樹(shù)作左右子樹(shù),構(gòu)造一棵新的二叉樹(shù),置新二叉樹(shù)根結(jié)點(diǎn)權(quán)值為其左右子樹(shù)根結(jié)點(diǎn)權(quán)值之和v在森林中刪除這兩棵樹(shù),同時(shí)將新得到的二叉樹(shù)加入森林中v重復(fù)上述兩步,直到只含一棵樹(shù)為止,這棵樹(shù)即哈夫曼樹(shù)例a7b5c2d4a7b5c2d46a7b5c2d4611a7b5c2d461118例 w=5, 29, 7, 8, 14, 23, 3, 1151429 7823 3111429 7823 113588715142923358111135819142923

22、8715113581929 23148715292914871529113581923421135819234229148715295811358192342291487152958100lHuffman算法實(shí)現(xiàn)Ch5_8.cu一棵有n個(gè)葉子結(jié)點(diǎn)的Huffman樹(shù)有2n-1個(gè)結(jié)點(diǎn)u采用順序存儲(chǔ)結(jié)構(gòu)一維結(jié)構(gòu)數(shù)組u結(jié)點(diǎn)類型定義typedef struct int data; int pa,lc,rc;JD;lc data rc pa1 2 3 4 5 6 70 0 0 0 0 0 07 5 2 4 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0(1)lc data rc pa1 2

23、 3 4 5 6 70 0 0 0 3 0 07 5 2 4 6 0 00 0 0 0 4 0 00 0 5 5 0 0 0kx1=3,x2=4m1=2,m2=4(2)lc data rc pa1 2 3 4 5 6 70 0 0 0 3 2 07 5 2 4 6 11 00 0 0 0 4 5 00 6 5 5 6 0 0kx1=2,x2=5m1=5,m2=6(3)lc data rc pa1 2 3 4 5 6 70 0 0 0 3 2 17 5 2 4 6 11 180 0 0 0 4 5 67 6 5 5 6 7 0kx1=1,x2=6m1=7,m2=11(4)Ch5_8.cvHuff

24、man樹(shù)應(yīng)用v最佳判定樹(shù)等級(jí)分?jǐn)?shù)段比例ABCDE05960697079 8089 901000.050.150.400.300.10a60a90a80a70EYNDYNCYNBYNA70a80a60CYNBYNDYNEYNA80a9060a70EADBCa80a70a60aAJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si

25、+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t); A B D C Ebt0000000000v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prpiP-AP-BJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0;

26、 t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0

27、000000000v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prP=NULLiP-AP-BJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-

28、lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000000000v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prPiP-A輸出:BJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=

29、bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);00000000001v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prP輸出:BiP-AP-CJD *zxxsh(JD *b

30、t) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t;

31、pr-rt=1; t-rc=pr; return(t);0000100000v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prP=NULLiP-AP-C輸出:BJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,

32、p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000100000v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prPiP-A輸出: B C JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t

33、-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);00001000001v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C

34、Ebtt 0 1prP=NULLiP-A輸出: B C JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p;

35、 pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000100010v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1prPi輸出: B C A JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si

36、+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);00001000101v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1Pi輸出: B C A prP-DJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(

37、JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);00001

38、01010v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1Pi輸出: B C A prP-DP-EJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p

39、-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000101010v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1P=NULLi輸出: B C A prP-DP-EJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-l

40、c=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000101010v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1Pi輸出: B C A E p

41、rP-DJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|

42、p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000101010 1v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1P=NULLi輸出: B C A E prP-DJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc;

43、 if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);0000101011v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1Pi輸出: B C A E D prJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(

44、sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);00001010111v算法v按中

45、序線索化二叉樹(shù)Ch5_20.cABCDE A B D C Ebtt 0 1P=NULLi輸出: B C A E D prJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr;

46、if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);00001011111v算法v按中序線索化二叉樹(shù)Ch5_20.cABCDE輸出: B C A E D A B D C Et 0 11111110000v算法v按中序線索化二叉樹(shù)v遍歷中序線索二叉樹(shù)Ch5_20.c在中序線索二叉樹(shù)中找結(jié)點(diǎn)后繼的方法:(1)若rt=1, 則rc域直接指向其后繼(2)若rt=0, 則結(jié)點(diǎn)的后繼應(yīng)是其右子樹(shù)的左鏈尾(lt=1)的結(jié)點(diǎn)在中序線索二叉樹(shù)中找結(jié)點(diǎn)前驅(qū)的方法

47、:(1)若lt=1, 則lc域直接指向其前驅(qū)(2)若lt=0, 則結(jié)點(diǎn)的前驅(qū)應(yīng)是其左子樹(shù)的右鏈尾(rt=1)的結(jié)點(diǎn)ABCDE 0 A 0 1 B 0 0 D 1 1 C 1 1 E 1 T中序序列:BCAED帶頭結(jié)點(diǎn)的中序線索二叉樹(shù) 0 1二叉排序樹(shù)定義:二叉排序樹(shù)或是一棵空樹(shù),或是具有下列性質(zhì)的二叉樹(shù):若它的左子樹(shù)不空,則左子樹(shù)上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值若它的右子樹(shù)不空,則右子樹(shù)上所有結(jié)點(diǎn)的值均大于或等于它的根結(jié)點(diǎn)的值它的左、右子樹(shù)也分別為二叉排序樹(shù)二叉排序樹(shù)的插入插入原則:若二叉排序樹(shù)為空,則插入結(jié)點(diǎn)應(yīng)為新的根結(jié)點(diǎn);否則,繼續(xù)在其左、右子樹(shù)上查找,直至某個(gè)結(jié)點(diǎn)的左子樹(shù)或右子樹(shù)為空為

48、止,則插入結(jié)點(diǎn)應(yīng)為該結(jié)點(diǎn)的左孩子或右孩子二叉排序樹(shù)生成:從空樹(shù)出發(fā),經(jīng)過(guò)一系列的查找、插入操作之后,可生成一棵二叉排序樹(shù)l插入算法例 10, 18, 3, 8, 12, 2, 7, 310101810183101838101838 12101838 122101838 1227101838 12273中序遍歷二叉排序樹(shù)可得到一個(gè)關(guān)鍵字的有序序列Ch5_9.cv二叉排序樹(shù)的刪除v要?jiǎng)h除二叉排序樹(shù)中的p結(jié)點(diǎn),分三種情況:vp為葉子結(jié)點(diǎn),只需修改p雙親f的指針f-lchild=NULL或 f-rchild=NULLvp只有左子樹(shù)或右子樹(shù)vp只有左子樹(shù),用p的左孩子代替p (1)(2)vp只有右子樹(shù),

49、用p的右孩子代替p (3)(4)vp左、右子樹(shù)均非空v沿p左子樹(shù)的根C的右子樹(shù)分支找到S,S的右子樹(shù)為空,將S的左子樹(shù)成為S的雙親Q的右子樹(shù),用S取代p (5)v若C無(wú)右子樹(shù),用C取代p (6)SQPLP中序遍歷:Q S PL PSQPL中序遍歷:Q S PL(2)SPPLQ中序遍歷:PL P S QSPLQ中序遍歷:PL S Q(1)中序遍歷:P PR S QSPRQ中序遍歷:PR S Q(3)SPPRQ中序遍歷:Q S P PRSQPR中序遍歷:Q S PR(4)SQPRPFPCPRCLQQLSSL中序遍歷:CL C QL Q SL S P PR FFSCPRCLQQLSL中序遍歷:CL

50、C QL Q SL S PR F(5)FPCPRCL中序遍歷:CL C P PR FFCPRCL中序遍歷:CL C PR F(6)l刪除算法例805012060110150557053刪除508060120110150557053刪除60805512011015053701042581354刪除1084255134刪除58425413Ch5_10.c樹(shù)的運(yùn)用:背包問(wèn)題樹(shù)的運(yùn)用:背包問(wèn)題假設(shè)有假設(shè)有n件物品,記做件物品,記做d1,d2,.,dn,對(duì)于每一個(gè)對(duì)于每一個(gè)di都有一個(gè)整數(shù)重量都有一個(gè)整數(shù)重量wi和和一個(gè)整數(shù)價(jià)值一個(gè)整數(shù)價(jià)值vi。如果從這。如果從這n件物品中件物品中挑選其中幾件物品裝入背包,使其總挑選其中幾件物品裝入背包,使其總重量不超過(guò)給定的重量重量不超過(guò)給定的重量tot,同時(shí)又使,同時(shí)又使背包中物品的價(jià)值盡可能高。背包中物品的價(jià)值盡可能高。裝填過(guò)程可這樣進(jìn)行:裝填過(guò)程可這樣進(jìn)行:依次考慮依次考慮n件物品件物品d1

溫馨提示

  • 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)論