數(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è),還剩114頁(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、第6章 樹(shù)和二叉樹(shù)6.1 樹(shù)的定義和基本術(shù)語(yǔ)6.2 二叉樹(shù)6.3 遍歷二叉樹(shù)和線索二叉樹(shù)6.4 樹(shù)和森林6.6 哈夫曼樹(shù)及其應(yīng)用作業(yè)實(shí)驗(yàn)6.1 樹(shù)的定義和基本術(shù)語(yǔ)結(jié)點(diǎn):結(jié)點(diǎn)的度:樹(shù)的度:葉子結(jié)點(diǎn):分支結(jié)點(diǎn):數(shù)據(jù)元素+若干指向子樹(shù)的分支分支的個(gè)數(shù)樹(shù)中所有結(jié)點(diǎn)的度的最大值度為零的結(jié)點(diǎn)度大于零的結(jié)點(diǎn)DHIJM(從根到結(jié)點(diǎn)的)路徑:孩子結(jié)點(diǎn)、雙親結(jié)點(diǎn)兄弟結(jié)點(diǎn)、堂兄弟祖先結(jié)點(diǎn)、子孫結(jié)點(diǎn) 由從根到該結(jié)點(diǎn)所經(jīng)分支和結(jié)點(diǎn)構(gòu)成ABCDEFGHIJMKL結(jié)點(diǎn)的層次:樹(shù)的深度:假設(shè)根結(jié)點(diǎn)的層次為1,第l 層的結(jié)點(diǎn)的子樹(shù)根結(jié)點(diǎn)的層次為l+1樹(shù)中葉子結(jié)點(diǎn)所在的最大層次ABCDEFGHIJMKL森林:是m(m0)棵互不相

2、交的樹(shù)的集合BEFKLACGDHIJMABCDEFGHIJMKLA( B(E, F(K, L), C(G), D(H, I, J(M) )T1T3T2樹(shù)根例如:() 有確定的根;() 樹(shù)根和子樹(shù)根之間為有向關(guān)系。有向樹(shù):有序樹(shù):子樹(shù)之間存在確定的次序關(guān)系。無(wú)序樹(shù):子樹(shù)之間不存在確定的次序關(guān)系。BEFKL對(duì)比樹(shù)型結(jié)構(gòu)和線性結(jié)構(gòu)的結(jié)構(gòu)特點(diǎn)線性結(jié)構(gòu)樹(shù)型結(jié)構(gòu)第一個(gè)數(shù)據(jù)元素 (無(wú)前驅(qū)) 根結(jié)點(diǎn) (無(wú)前驅(qū))最后一個(gè)數(shù)據(jù)元素 (無(wú)后繼)多個(gè)葉子結(jié)點(diǎn) (無(wú)后繼)其它數(shù)據(jù)元素(一個(gè)前驅(qū)、 一個(gè)后繼)其它數(shù)據(jù)元素(一個(gè)前驅(qū)、 多個(gè)后繼) 而現(xiàn)實(shí)中的許多事物的關(guān)系并非這樣簡(jiǎn)單,如人類社會(huì)的族譜、各種社會(huì)組織機(jī)構(gòu)以及

3、城市交通、通訊等,這些事物中的聯(lián)系都是非線性的,采用非線性結(jié)構(gòu)進(jìn)行描繪會(huì)更明確和便利。 在前面幾章里討論的數(shù)據(jù)結(jié)構(gòu)都屬于線性結(jié)構(gòu) 線性結(jié)構(gòu)的特點(diǎn)是邏輯結(jié)構(gòu)簡(jiǎn)單,易于進(jìn)行查找、插入和刪除等操作 其主要用于對(duì)客觀世界中具有單一的前驅(qū)和后繼的數(shù)據(jù)關(guān)系進(jìn)行描述 所謂非線性結(jié)構(gòu)是指,在該結(jié)構(gòu)中至少存在一個(gè)數(shù)據(jù)元素,有兩個(gè)或兩個(gè)以上的直接前驅(qū)(或直接后繼)元素。 樹(shù)型結(jié)構(gòu)和圖型就是其中十分重要的非線性結(jié)構(gòu),可以用來(lái)描述客觀世界中廣泛存在的層次結(jié)構(gòu)和網(wǎng)狀結(jié)構(gòu)的關(guān)系,如前面提到的族譜、城市交通等。 本章對(duì)樹(shù)型結(jié)構(gòu)中最簡(jiǎn)單、應(yīng)用十分廣泛的二叉樹(shù)結(jié)構(gòu)進(jìn)行討論。 二叉樹(shù)或?yàn)榭諛?shù),或是由一個(gè)根結(jié)點(diǎn)加上 兩棵分別稱為左

4、子樹(shù)和右子樹(shù)的、互不交的二叉樹(shù)組成。ABCDEFGHK根結(jié)點(diǎn)左子樹(shù)右子樹(shù)6.2 二叉樹(shù)6.2.1 二叉樹(shù)的定義二叉樹(shù)的五種基本形態(tài):N空樹(shù)只含根結(jié)點(diǎn)NNNLRR右子樹(shù)為空樹(shù)L左子樹(shù)為空樹(shù)左右子樹(shù)均不為空樹(shù) 二叉樹(shù)的主要基本操作:查 找 插 入 刪 除 性質(zhì) 1 : 在二叉樹(shù)的第 i 層上至多有2i-1 個(gè)結(jié)點(diǎn)。 (i1)用歸納法證明: 歸納基: 歸納假設(shè): 歸納證明:i = 1 層時(shí),只有一個(gè)根結(jié)點(diǎn): 2i-1 = 20 = 1;假設(shè)對(duì)所有的 j,1 j i,命題成立;二叉樹(shù)上每個(gè)結(jié)點(diǎn)至多有兩棵子樹(shù),則第 i 層的結(jié)點(diǎn)數(shù) = 2i-2 2 = 2i-1 。6.2.2 二叉樹(shù)的性質(zhì)性質(zhì) 2 :

5、深度為 k 的二叉樹(shù)上至多含 2k-1 個(gè)結(jié)點(diǎn)(k1)。證明: 基于上一條性質(zhì),深度為 k 的二叉樹(shù)上的結(jié)點(diǎn)數(shù)至多為 20+21+ +2k-1 = 2k-1 。 性質(zhì) 3 : 對(duì)任何一棵二叉樹(shù),若它含有n0 個(gè)葉子結(jié)點(diǎn)、n2 個(gè)度為 2 的結(jié)點(diǎn),則必存在關(guān)系式:n0 = n2+1。證明:設(shè) 二叉樹(shù)上結(jié)點(diǎn)總數(shù) n = n0 + n1 + n2又 二叉樹(shù)上分支總數(shù) b = n1+2n2 而 b = n-1 = n0 + n1 + n2 - 1由此, n0 = n2 + 1 。兩類特殊的二叉樹(shù):滿二叉樹(shù):指的是深度為k且含有2k-1個(gè)結(jié)點(diǎn)的二叉樹(shù)。完全二叉樹(shù):樹(shù)中所含的 n 個(gè)結(jié)點(diǎn)和滿二叉樹(shù)中編號(hào)為

6、 1 至 n 的結(jié)點(diǎn)一一對(duì)應(yīng)。123456789101112131415abcdefghij 性質(zhì) 4 : 具有 n 個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度為 log2n +1 。證明:設(shè)完全二叉樹(shù)的深度為 k 則根據(jù)第二條性質(zhì)得 2k-1 n 2k 即 k-1 log2 n n,則該結(jié)點(diǎn)無(wú)左孩子, 否則,編號(hào)為 2i 的結(jié)點(diǎn)為其左孩子結(jié)點(diǎn);(3) 若 2i+1n,則該結(jié)點(diǎn)無(wú)右孩子結(jié)點(diǎn), 否則,編號(hào)為2i+1 的結(jié)點(diǎn)為其右孩子結(jié)點(diǎn)。2.二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)表示1. 二叉樹(shù)的順序存儲(chǔ)表示6.2.3 二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)#define MAX_TREE_SIZE 100 / 二叉樹(shù)的最大結(jié)點(diǎn)數(shù)typedef TElem

7、Type SqBiTreeMAX_ TREE_SIZE; / 0號(hào)單元存儲(chǔ)根結(jié)點(diǎn)SqBiTree bt;1. 二叉樹(shù)的順序存儲(chǔ)表示 例如:ABCDEF A B D C E F 0 1 2 3 4 5 6 7 8 9 10 11 12 1314013262、二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)表示(1) 二叉鏈表(2)三叉鏈表ADEBCFrootlchild data rchild結(jié)點(diǎn)結(jié)構(gòu):(1) 二叉鏈表typedef struct BiTNode / 結(jié)點(diǎn)結(jié)構(gòu) TElemType data; struct BiTNode *lchild, *rchild; / 左右孩子指針 BiTNode, *BiTree;l

8、child data rchild結(jié)點(diǎn)結(jié)構(gòu):C 語(yǔ)言的類型描述如下:ADEBCFroot(2)三叉鏈表parent lchild data rchild結(jié)點(diǎn)結(jié)構(gòu): typedef struct TriTNode / 結(jié)點(diǎn)結(jié)構(gòu) TElemType data; struct TriTNode *lchild, *rchild; / 左右孩子指針 struct TriTNode *parent; /雙親指針 TriTNode, *TriTree;parent lchild data rchild結(jié)點(diǎn)結(jié)構(gòu):C 語(yǔ)言的類型描述如下:6.3 遍歷二叉樹(shù)和線索二叉樹(shù)一、問(wèn)題的提出二、先左后右的遍歷算法三、算

9、法的遞歸描述四、中序遍歷算法的非遞歸描述五、遍歷算法的應(yīng)用舉例(對(duì)教材的補(bǔ)充)6.3.1 遍歷二叉樹(shù) 順著某一條搜索路徑巡訪二叉樹(shù)中的結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)均被訪問(wèn)一次,而且僅被訪問(wèn)一次。一、問(wèn)題的提出“訪問(wèn)”的含義可以很廣,如:輸出結(jié)點(diǎn)的信息等。 “遍歷”是任何類型均有的操作,對(duì)線性結(jié)構(gòu)而言,只有一條搜索路徑(因?yàn)槊總€(gè)結(jié)點(diǎn)均只有一個(gè)后繼),故不需要另加討論。 而二叉樹(shù)是非線性結(jié)構(gòu),每個(gè)結(jié)點(diǎn)有兩個(gè)后繼,則存在如何遍歷即按什么樣的搜索路徑遍歷的問(wèn)題。 對(duì)“二叉樹(shù)”而言,可以有三條搜索路徑:1先上后下的按層次遍歷;2先左(子樹(shù))后右(子樹(shù))的遍歷;3先右(子樹(shù))后左(子樹(shù))的遍歷。二、先左后右的遍歷算

10、法先(根)序的遍歷算法中(根)序的遍歷算法后(根)序的遍歷算法 若二叉樹(shù)為空樹(shù),則空操作;否則,(1)訪問(wèn)根結(jié)點(diǎn);(2)先序遍歷左子樹(shù);(3)先序遍歷右子樹(shù)。先(根)序的遍歷算法: 若二叉樹(shù)為空樹(shù),則空操作;否則,(1)中序遍歷左子樹(shù);(2)訪問(wèn)根結(jié)點(diǎn);(3)中序遍歷右子樹(shù)。中(根)序的遍歷算法: 若二叉樹(shù)為空樹(shù),則空操作;否則,(1)后序遍歷左子樹(shù);(2)后序遍歷右子樹(shù);(3)訪問(wèn)根結(jié)點(diǎn)。后(根)序的遍歷算法:三、算法的遞歸描述void Preorder (BiTree T, void( *visit)(TElemType& e) / 先序遍歷二叉樹(shù) if (T) visit(T-data)

11、; / 訪問(wèn)結(jié)點(diǎn) Preorder(T-lchild, visit); / 遍歷左子樹(shù) Preorder(T-rchild, visit);/ 遍歷右子樹(shù) 算法6.1四、中序遍歷算法的非遞歸描述Status InOrderTraverse(BiTree T,Status(*visit)(TElemType e)InitStack(S); push(S,T);while(!StackEmpty(S)while(GetTop(S,p)&p) push(S,p-lchild);pop(S,p);if(!StackEmpty(S)pop(S,p); if(!visit(p-data) return E

12、RROR;push(S,p-rchild);return OK;算法6.2算法6.3Status InOrderTraverse(BiTree T,Status (*visit)(TElemType e) InitStack(S); p=T; while(p|!StackEmpty(S) if(p) push(S,p);p=p-lchild;else pop(S,p); if(!visit(p-data) ) return ERROR;return OK;五、遍歷算法的應(yīng)用舉例1、統(tǒng)計(jì)二叉樹(shù)中葉子結(jié)點(diǎn)的個(gè)數(shù) (先序遍歷)2、求二叉樹(shù)的深度(后序遍歷)3、建立二叉樹(shù)1、統(tǒng)計(jì)二叉樹(shù)中葉子結(jié)點(diǎn)的個(gè)數(shù)

13、算法基本思想: 先序(或中序或后序)遍歷二叉樹(shù),在遍歷過(guò)程中查找葉子結(jié)點(diǎn),并計(jì)數(shù)。由此,需在遍歷算法中增添一個(gè)“計(jì)數(shù)”的參數(shù),并將算法中“訪問(wèn)結(jié)點(diǎn)”的操作改為:若是葉子,則計(jì)數(shù)器增1。void CountLeaf (BiTree T, int& count) if ( T ) if (!T-lchild)& (!T-rchild) count+; / 對(duì)葉子結(jié)點(diǎn)計(jì)數(shù) CountLeaf( T-lchild, count); CountLeaf( T-rchild, count); / if / CountLeaf2、求二叉樹(shù)的深度(后序遍歷)算法基本思想: 從二叉樹(shù)深度的定義可知,二叉樹(shù)的深度

14、應(yīng)為其左、右子樹(shù)深度的最大值加1。由此,需先分別求得左、右子樹(shù)的深度,算法中“訪問(wèn)結(jié)點(diǎn)”的操作為:求得左、右子樹(shù)深度的最大值,然后加 1 。 首先分析二叉樹(shù)的深度和它的左、右子樹(shù)深度之間的關(guān)系。int Depth (BiTree T ) / 返回二叉樹(shù)的深度 if ( !T ) depthval = 0; else depthLeft = Depth( T-lchild ); depthRight= Depth( T-rchild ); depthval = 1 + (depthLeft depthRight ? depthLeft : depthRight); return depthval

15、;不同的定義方法相應(yīng)有不同的存儲(chǔ)結(jié)構(gòu)的建立算法3、建立二叉樹(shù) (1) 以字符串的形式 根 左子樹(shù) 右子樹(shù)定義一棵二叉樹(shù)例如:ABCD以空白字符“ ”表示A(B( ,C( , ),D( , )空樹(shù)只含一個(gè)根結(jié)點(diǎn)的二叉樹(shù)A以字符串“A ”表示以下列字符串表示Status CreateBiTree(BiTree &T) scanf(&ch); if (ch= ) T = NULL; else if (!(T = (BiTNode *)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; / 生成根結(jié)點(diǎn) CreateBiTree(T-lchild);

16、/ 構(gòu)造左子樹(shù) CreateBiTree(T-rchild); / 構(gòu)造右子樹(shù) return OK; / CreateBiTree算法6.4A B C D ABCD上頁(yè)算法執(zhí)行過(guò)程舉例如下:ATBCD(2) 按給定的表達(dá)式建相應(yīng)二叉樹(shù) 由先綴表示式建樹(shù)例如:已知表達(dá)式的先綴表示式 -+ a b c / d e 由原表達(dá)式建樹(shù)例如:已知表達(dá)式 (a+b)c d/e對(duì)應(yīng)先綴表達(dá)式 -+ a b c / d e的二叉樹(shù)abcde-+/特點(diǎn): 操作數(shù)為葉子結(jié)點(diǎn) 運(yùn)算符為分支結(jié)點(diǎn)scanf(&ch);if ( In(ch, 字母集 ) 建葉子結(jié)點(diǎn);else 建根結(jié)點(diǎn); 遞歸建左子樹(shù); 遞歸建右子樹(shù);由先

17、綴表示式建樹(shù)的算法的基本操作:a+b(a+b)c d/ea+bc 分析表達(dá)式和二叉樹(shù)的關(guān)系:ab+abc+abc+(a+b)cabcde-+/基本操作:scanf(&ch);if (In(ch, 字母集 ) 建葉子結(jié)點(diǎn); 暫存; else if (In(ch, 運(yùn)算符集) 和前一個(gè)運(yùn)算符比較優(yōu)先數(shù); 若當(dāng)前的優(yōu)先數(shù)“高”,則暫存; 否則建子樹(shù); void CrtExptree(BiTree &T, char exp ) InitStack(S); Push(S, #); InitStack(PTR); p = exp; ch = *p; while (!(GetTop(S)=# & ch=#)

18、 if (!IN(ch, OP) CrtNode( t, ch ); / 建葉子結(jié)點(diǎn)并入棧 else if ( ch!= # ) p+; ch = *p; / while Pop(PTR, T); / CrtExptree switch (ch) case ( : Push(S, ch); break; case ) : Pop(S, c); while (c!= ( ) CrtSubtree( t, c); / 建二叉樹(shù)并入棧 Pop(S, c) break; defult : / switch while(!Gettop(S, c) & ( precede(c,ch) CrtSubtree

19、( t, c); Pop(S, c);if ( ch!= # ) Push( S, ch); break;建葉子結(jié)點(diǎn)的算法為:void CrtNode(BiTree& T,char ch) T=(BiTNode*)malloc(sizeof(BiTNode); T-data = char; T-lchild = T-rchild = NULL; Push( PTR, T );建子樹(shù)的算法為:void CrtSubtree (Bitree& T, char c) T=(BiTNode*)malloc(sizeof(BiTNode); T-data = c; Pop(PTR, rc); T-rch

20、ild = rc; Pop(PTR, lc); T-lchild = lc; Push(PTR, T); 僅知二叉樹(shù)的先序序列“abcdefg” 不能唯一確定一棵二叉樹(shù),(3)由二叉樹(shù)的先序和中序序列建樹(shù) 如果同時(shí)已知二叉樹(shù)的中序序列“cbdaegf”,則會(huì)如何? 二叉樹(shù)的先序序列二叉樹(shù)的中序序列左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)根根a b c d e f gc b d a e g f例如:aab bccddeeffggabcdefg先序序列中序序列void CrtBT(BiTree& T, char pre, char ino, int ps, int is, int n ) / 已知preps.ps

21、+n-1為二叉樹(shù)的先序序列, / insis.is+n-1為二叉樹(shù)的中序序列,本算 / 法由此兩個(gè)序列構(gòu)造二叉鏈表 if (n=0) T=NULL; else k=Search(ino, preps); / 在中序序列中查詢 if (k= -1) T=NULL; else / / CrtBT T=(BiTNode*)malloc(sizeof(BiTNode);T-data = preps;if (k=is) T-Lchild = NULL;else CrtBT(T-Lchild, pre, ino, ps+1, is, k-is );if (k=is+n-1) T-Rchild = NULL

22、;else CrtBT(T-Rchild, pre, ino, ps+1+(k-is), k+1, n-(k-is)-1 );遍歷二叉樹(shù)的結(jié)果是, 求得結(jié)點(diǎn)的一個(gè)線性序列。ABCDEFGHK例如:先序序列: A B C D E F G H K中序序列: B D C A H G K F E后序序列: D C B H K G F E A6.3.2 線索二叉樹(shù)指向該線性序列中的“前驅(qū)”和 “后繼” 的指針,稱作“線索”與其相應(yīng)的二叉樹(shù),稱作 “線索二叉樹(shù)”包含 “線索” 的存儲(chǔ)結(jié)構(gòu),稱作 “線索鏈表”A B C D E F G H K D C B E 對(duì)線索鏈表中結(jié)點(diǎn)的約定: 在二叉鏈表的結(jié)點(diǎn)中增加

23、兩個(gè)標(biāo)志域,并作如下規(guī)定:若該結(jié)點(diǎn)的左子樹(shù)不空,則Lchild域的指針指向其左子樹(shù), 且左標(biāo)志域的值為“指針 Link”; 否則,Lchild域的指針指向其“前驅(qū)”, 且左標(biāo)志的值為“線索 Thread” 。若該結(jié)點(diǎn)的右子樹(shù)不空,則rchild域的指針指向其右子樹(shù), 且右標(biāo)志域的值為 “指針 Link”;否則,rchild域的指針指向其“后繼”, 且右標(biāo)志的值為“線索 Thread”。 如此定義的二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)稱作“線索鏈表”。6.4.1 樹(shù)的三種存儲(chǔ)結(jié)構(gòu)一、雙親表示法二、孩子鏈表表示法三、樹(shù)的二叉鏈表(孩子-兄弟) 存儲(chǔ)表示法6.4 樹(shù)和森林ABCDEFG0 A -11 B 02 C 03

24、 D 04 E 2 5 F 26 G 5r=0n=6data parent一、雙親表示法: typedef struct PTNode Elem data; int parent; / 雙親位置域 PTNode; data parent#define MAX_TREE_SIZE 100結(jié)點(diǎn)結(jié)構(gòu):C語(yǔ)言的類型描述:typedef struct PTNode nodes MAX_TREE_SIZE; int r, n; / 根結(jié)點(diǎn)的位置和結(jié)點(diǎn)個(gè)數(shù) PTree;樹(shù)結(jié)構(gòu):ABCDEFG0 A -11 B 02 C 03 D 04 E 25 F 26 G 5r=0n=6 data firstchild

25、1 2 34 56二、孩子鏈表表示法:-1000224typedef struct CTNode int child; struct CTNode *next; *ChildPtr;孩子結(jié)點(diǎn)結(jié)構(gòu): child nextC語(yǔ)言的類型描述: typedef struct Elem data; ChildPtr firstchild; / 孩子鏈的頭指針 CTBox;雙親結(jié)點(diǎn)結(jié)構(gòu) data firstchildtypedef struct CTBox nodesMAX_TREE_SIZE; int n, r; / 結(jié)點(diǎn)數(shù)和根結(jié)點(diǎn)的位置 CTree;樹(shù)結(jié)構(gòu):ABCDEFG AB C E D F Gro

26、ot AB C E D F G 三、樹(shù)的二叉鏈表 (孩子-兄弟)存儲(chǔ)表示法typedef struct CSNode Elem data; struct CSNode *firstchild, *nextsibling; CSNode, *CSTree;C語(yǔ)言的類型描述:結(jié)點(diǎn)結(jié)構(gòu): firstchild data nextsibling 6.4.2 森林和二叉樹(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

27、= ;否則, 由 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);由RBT 對(duì)應(yīng)得到 (T2, T3, , Tn)。 由此,樹(shù)的各種操作均可對(duì)應(yīng)二叉樹(shù)的操作來(lái)完成。 應(yīng)當(dāng)注意的是,和樹(shù)對(duì)應(yīng)的二叉樹(shù),其左、右子樹(shù)的概念已改變?yōu)椋?左是孩子,右是兄弟。6.4.3 樹(shù)和森林的遍歷樹(shù)的遍歷可有三條搜索路徑

28、:按層次遍歷:先根(次序)遍歷:后根(次序)遍歷: 若樹(shù)不空,則先訪問(wèn)根結(jié)點(diǎn),然后依次先根遍歷各棵子樹(shù)。 若樹(shù)不空,則先依次后根遍歷各棵子樹(shù),然后訪問(wèn)根結(jié)點(diǎn)。 若樹(shù)不空,則自上而下自左至右訪問(wèn)樹(shù)中每個(gè)結(jié)點(diǎn)。 A B C DE F G H I J K 先根遍歷時(shí)頂點(diǎn)的訪問(wèn)次序:A B E F C D G H I J K 后根遍歷時(shí)頂點(diǎn)的訪問(wèn)次序:E F B C I J K H G D A 層次遍歷時(shí)頂點(diǎn)的訪問(wèn)次序:A B C D E F G H I J K B C DE F G H I J K1森林中第一棵樹(shù)的根結(jié)點(diǎn);2森林中第一棵樹(shù)的子樹(shù)森林;3森林中其它樹(shù)構(gòu)成的森林。森林由三部分構(gòu)成:1.

29、先序遍歷森林的遍歷 若森林不空,則訪問(wèn)森林中第一棵樹(shù)的根結(jié)點(diǎn);先序遍歷森林中第一棵樹(shù)的子樹(shù)森林;先序遍歷森林中(除第一棵樹(shù)之外)其 余樹(shù)構(gòu)成的森林。即:依次從左至右對(duì)森林中的每一棵樹(shù)進(jìn)行先根遍歷。中序遍歷 若森林不空,則中序遍歷森林中第一棵樹(shù)的子樹(shù)森林;訪問(wèn)森林中第一棵樹(shù)的根結(jié)點(diǎn);中序遍歷森林中(除第一棵樹(shù)之外)其 余樹(shù)構(gòu)成的森林。即:依次從左至右對(duì)森林中的每一棵樹(shù)進(jìn)行后根遍歷。 最優(yōu)樹(shù)的定義 如何構(gòu)造最優(yōu)樹(shù) 前綴編碼 6.6 哈夫曼樹(shù)及其應(yīng)用 一、最優(yōu)樹(shù)的定義樹(shù)的路徑長(zhǎng)度定義為: 樹(shù)中每個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和。 結(jié)點(diǎn)的路徑長(zhǎng)度定義為: 從根結(jié)點(diǎn)到該結(jié)點(diǎn)的路徑上 分支的數(shù)目。 樹(shù)的帶權(quán)路徑長(zhǎng)度定

30、義為: 樹(shù)中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和 WPL(T) = wklk (對(duì)所有葉子結(jié)點(diǎn))。 在所有含 n 個(gè)葉子結(jié)點(diǎn)、并帶相同權(quán)值的 m 叉樹(shù)中,必存在一棵其帶權(quán)路徑長(zhǎng)度取最小值的樹(shù),稱為“最優(yōu)樹(shù)”。例如:27 9 75492WPL(T)= 72+52+23+43+92 =60WPL(T)= 74+94+53+42+21 =89 54 根據(jù)給定的 n 個(gè)權(quán)值 w1, w2, , wn, 構(gòu)造 n 棵二叉樹(shù)的集合 F = T1, T2, , Tn, 其中每棵二叉樹(shù)中均只含一個(gè)帶權(quán)值 為 wi 的根結(jié)點(diǎn),其左、右子樹(shù)為空樹(shù);二、如何構(gòu)造最優(yōu)樹(shù)(1)(赫夫曼算法) 以二叉樹(shù)為例: 在 F 中選取其

31、根結(jié)點(diǎn)的權(quán)值為最 小的兩棵二叉樹(shù),分別作為左、 右子樹(shù)構(gòu)造一棵新的二叉樹(shù),并 置這棵新的二叉樹(shù)根結(jié)點(diǎn)的權(quán)值 為其左、右子樹(shù)根結(jié)點(diǎn)的權(quán)值之 和;(2) 從F中刪去這兩棵樹(shù),同時(shí)加入 剛生成的新樹(shù); 重復(fù) (2) 和 (3) 兩步,直至 F 中只 含一棵樹(shù)為止。(3)(4)9例如: 已知權(quán)值 W= 5, 6, 2, 9, 7 5627527697671395276713952795271667132900001111000110110111 指的是,任何一個(gè)字符的編碼都不是同一字符集中另一個(gè)字符的編碼的前綴。三、前綴編碼 利用赫夫曼樹(shù)可以構(gòu)造一種不等長(zhǎng)的二進(jìn)制編碼,并且構(gòu)造所得的赫夫曼編碼是一種最

32、優(yōu)前綴編碼,即使所傳電文的總長(zhǎng)度最短。1. 熟練掌握二叉樹(shù)的結(jié)構(gòu)特性,了解相應(yīng)的證明方法。2. 熟悉二叉樹(shù)的各種存儲(chǔ)結(jié)構(gòu)的特點(diǎn)及適用范圍。3. 遍歷二叉樹(shù)是二叉樹(shù)各種操作的基礎(chǔ)。實(shí)現(xiàn)二叉樹(shù)遍歷的具體算法與所采用的存儲(chǔ)結(jié)構(gòu)有關(guān)。掌握各種遍歷策略的遞歸算法,靈活運(yùn)用遍歷算法實(shí)現(xiàn)二叉樹(shù)的其它操作。層次遍歷是按另一種搜索策略進(jìn)行的遍歷。4. 理解二叉樹(shù)線索化的實(shí)質(zhì)是建立結(jié)點(diǎn)與其在相應(yīng)序列中的前驅(qū)或后繼之間的直接聯(lián)系,熟練掌握二叉樹(shù)的線索化過(guò)程以及在中序線索化樹(shù)上找給定結(jié)點(diǎn)的前驅(qū)和后繼的方法。二叉樹(shù)的線索化過(guò)程是基于對(duì)二叉樹(shù)進(jìn)行遍歷,而線索二叉樹(shù)上的線索又為相應(yīng)的遍歷提供了方便。5. 熟悉樹(shù)的各種存儲(chǔ)結(jié)

33、構(gòu)及其特點(diǎn),掌握樹(shù)和森林與二叉樹(shù)的轉(zhuǎn)換方法。建立存儲(chǔ)結(jié)構(gòu)是進(jìn)行其它操作的前提,因此讀者應(yīng)掌握 1 至 2 種建立二叉樹(shù)和樹(shù)的存儲(chǔ)結(jié)構(gòu)的方法。6. 學(xué)會(huì)編寫(xiě)實(shí)現(xiàn)樹(shù)的各種操作的算法。7. 了解最優(yōu)樹(shù)的特性,掌握建立最優(yōu)樹(shù)和哈夫曼編碼的方法。作業(yè)一、選擇題1、樹(shù)最適合用來(lái)表示_A)有序數(shù)據(jù)元素B)無(wú)序數(shù)據(jù)元素C)元素之間具有分支層次關(guān)系的數(shù)據(jù)D)元素之間無(wú)聯(lián)系的數(shù)據(jù)2、將一棵有100個(gè)結(jié)點(diǎn)的完全二叉樹(shù)從根這一層開(kāi)始,每一層從左到右依次對(duì)結(jié)點(diǎn)進(jìn)行編號(hào),根結(jié)點(diǎn)的編號(hào)為1,則編號(hào)為49的結(jié)點(diǎn)的左孩子編號(hào)為_(kāi)。A)98 B)99 C)50 D)483、在下圖所示的4棵二叉樹(shù)中,_不是完全二叉樹(shù)。A)圖(a)

34、 B)圖(b) C)圖(c) D)圖(d)(a)(b)(c)(d)4、在一棵二叉樹(shù)中,雙分支的結(jié)點(diǎn)數(shù)為15,單分支結(jié)點(diǎn)數(shù)為30,則葉子結(jié)點(diǎn)數(shù)為_(kāi)。A)15 B)16 C)17 D)475、判斷線索二叉樹(shù)中某結(jié)點(diǎn)*p有左孩子的條件是_。A)p-lchild=NULL B)p-lchild=NULLC)p-ltag=0 D)p-ltag=16、如果T1是由有序樹(shù)T轉(zhuǎn)換而來(lái)的二叉樹(shù),那么T中結(jié)點(diǎn)的前序遍歷序列就是T1中結(jié)點(diǎn)的_遍歷序列。A)前序 B)中序 C)后序 D)層次序abdecfhg7、一棵二叉樹(shù)如下圖所示,其中序遍歷的序列為_(kāi)。A)abdgcefh B)dgbaechfC)gdbehfca

35、 D)abcdefgh8、深度為5的二叉樹(shù)至多有_個(gè)結(jié)點(diǎn)。A)16 B)32 C)31 D)109、在一非空二叉樹(shù)的中序遍歷序列中,根結(jié)點(diǎn)的右邊_。A)只有右子樹(shù)上的所有結(jié)點(diǎn) B)只有右子樹(shù)上的部分結(jié)點(diǎn)C)只有左子樹(shù)上的部分結(jié)點(diǎn) D)只有左子樹(shù)上的所有結(jié)點(diǎn)10、如下圖所示的T2是由森林T1轉(zhuǎn)換而來(lái)的二叉樹(shù),那么森林T1有_個(gè)葉結(jié)點(diǎn)。A)4 B)5 C)6 D)711、設(shè)n、m為一棵二叉樹(shù)上的兩個(gè)結(jié)點(diǎn),在中序遍歷時(shí),n在m前的條件是_。A)n在m右方 B)n是m祖先 C)n在m左方 D)n是m子孫12、有n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹(shù)的結(jié)點(diǎn)總數(shù)為_(kāi)。A)不確定 B)2n C)2n1 D)2n113、設(shè)樹(shù)

36、T的度為4,其中度為1、2、3、4的結(jié)點(diǎn)個(gè)數(shù)分別為4、2、1、1,則T中的葉子數(shù)為_(kāi)。A)5 B)6 C)7 D)814、有n個(gè)葉子的哈夫曼樹(shù)的結(jié)點(diǎn)總數(shù)為_(kāi)A)不確定 B)2n C)2n1 D)2n115、樹(shù)的先序遍歷是_A)先訪問(wèn)樹(shù)的根結(jié)點(diǎn),再?gòu)淖蟮接乙来蜗刃虮闅v根結(jié)點(diǎn)的各子樹(shù)B)先序遍歷根結(jié)點(diǎn)的各子樹(shù),最后訪問(wèn)根結(jié)點(diǎn)C)先從左到右依次先序遍歷根結(jié)點(diǎn)的各子樹(shù)D)先訪問(wèn)樹(shù)的根結(jié)點(diǎn),再?gòu)挠业阶笠来蜗刃虮闅v根結(jié)點(diǎn)的各子樹(shù)16、除根結(jié)點(diǎn)外,樹(shù)上每個(gè)結(jié)點(diǎn)_A)可有任意多個(gè)孩子,任意多個(gè)雙親 B)可有任意多個(gè)孩子、一個(gè)雙親C)可有一個(gè)孩子、任意多個(gè)雙親 D)只有一個(gè)孩子、一個(gè)雙親18、現(xiàn)有一棵結(jié)點(diǎn)總數(shù)為

37、20的二叉樹(shù),它含有4個(gè)度為2的結(jié)點(diǎn),由此可知其葉子結(jié)點(diǎn)數(shù)為_(kāi)A)20 B)16 C)11 D)519、若由一棵一般樹(shù)轉(zhuǎn)化得到的二叉樹(shù)是非空二叉樹(shù),則該二叉樹(shù)的形狀是_A)根結(jié)點(diǎn)無(wú)右子樹(shù)的二叉樹(shù) B)根結(jié)點(diǎn)無(wú)左子樹(shù)的二叉樹(shù)C)根結(jié)點(diǎn)可能有左子樹(shù)和右子樹(shù) D)各結(jié)點(diǎn)只有一個(gè)孩子的二叉樹(shù) 20、若由森林轉(zhuǎn)化得到的二叉樹(shù)是非空二叉樹(shù),則該二叉樹(shù)的形狀是_A)根結(jié)點(diǎn)無(wú)右子樹(shù)的二叉樹(shù) B)根結(jié)點(diǎn)無(wú)左子樹(shù)的二叉樹(shù)C)根結(jié)點(diǎn)可能有左子樹(shù)和右子樹(shù) D)各結(jié)點(diǎn)只有一個(gè)孩子的二叉樹(shù)21、哈夫曼樹(shù)是訪問(wèn)葉子結(jié)點(diǎn)的外部路徑長(zhǎng)度_的二叉樹(shù)。A)最短 B)最長(zhǎng) C)可變 D)固定22、從1開(kāi)始對(duì)二叉樹(shù)進(jìn)行連續(xù)編號(hào),要求每

38、個(gè)結(jié)點(diǎn)的編號(hào)大于其左、右孩子的編號(hào)。在同一個(gè)結(jié)點(diǎn)的左、右孩子中,其左孩子的編號(hào)小于其右孩子的編號(hào),則可采用_遍歷實(shí)現(xiàn)編號(hào)。A)先序 B)中序 C)后序 D)從根開(kāi)始的層次遍歷23、二叉樹(shù)在線索化后,下列問(wèn)題中相對(duì)較難解決的是_A)先序線索二叉樹(shù)中求先序后繼 B)中序線索二叉樹(shù)中求中序后繼C)中序線索二叉樹(shù)中求中序前趨 D)后序線索二叉樹(shù)中求后序后繼24、一棵左子樹(shù)為空的二叉樹(shù)在先序線索化后,其空指針域數(shù)為_(kāi)A)0 B)1 C)2 D)不確定25、對(duì)具有100個(gè)結(jié)點(diǎn)的二叉樹(shù),若用二叉鏈表存儲(chǔ),則其指針域部分用來(lái)指向結(jié)點(diǎn)的左、右孩子,其余_個(gè)指針域?yàn)榭?。A)50 B)99 C)100 D)10126、設(shè)有13個(gè)值,用它們組成一棵哈夫曼樹(shù),則該哈夫曼樹(shù)中共有_個(gè)結(jié)點(diǎn)。A)13 B)12 C)26 D)25二、填空題1、若已知一棵二叉樹(shù)的先序序列和中序序列分別是BEFCGDH和FEBGCHD,則它的后序序列是_,層次遍歷

溫馨提示

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