版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2022-5-231 樹和二叉樹2022-5-2326.1 樹的類型定義6.2 二叉樹的類型定義6.3 二叉樹的存儲(chǔ)結(jié)構(gòu)6.4 二叉樹的遍歷6.5 線索二叉樹6.6 樹和森林的表示方法6.7 樹和森林的遍歷6.8 哈夫曼樹與哈夫曼編碼目目 錄錄2022-5-2336.1 2022-5-234若若D為空集,為空集,則稱為空樹;則稱為空樹;否則否則:(1) 在在D中存在唯一的稱為根的數(shù)據(jù)元素中存在唯一的稱為根的數(shù)據(jù)元素root,(2) 當(dāng)當(dāng)n1時(shí),其余結(jié)點(diǎn)可分為時(shí),其余結(jié)點(diǎn)可分為m (m0)個(gè)互個(gè)互 不相交的有限集不相交的有限集T1, T2, , Tm, 其中每一其中每一 個(gè)子集本身又是一棵符合本
2、定義的樹,個(gè)子集本身又是一棵符合本定義的樹, 稱為根稱為根root的子樹。的子樹。D是具有相同特性的數(shù)據(jù)元素的集合。是具有相同特性的數(shù)據(jù)元素的集合。ADT2022-5-235樹的示例樹的示例2022-5-2362022-5-237ABCDEFGHIJMKLA( B(E, F(K, L), C(G), D(H, I, J(M) )T1T3T2樹根2022-5-238() 有確定的根;有確定的根;() 樹根和子樹根之間為有向關(guān)系。樹根和子樹根之間為有向關(guān)系。子樹之間存在確定的次序關(guān)系。子樹之間存在確定的次序關(guān)系。子樹之間不存在確定的次序關(guān)系。子樹之間不存在確定的次序關(guān)系。2022-5-239對(duì)比對(duì)
3、比樹型結(jié)構(gòu)樹型結(jié)構(gòu)和和線性結(jié)構(gòu)線性結(jié)構(gòu)的的結(jié)構(gòu)特點(diǎn)結(jié)構(gòu)特點(diǎn)2022-5-2310線性結(jié)構(gòu)線性結(jié)構(gòu)樹型結(jié)構(gòu)樹型結(jié)構(gòu)第一個(gè)數(shù)據(jù)元素第一個(gè)數(shù)據(jù)元素 ( (無(wú)前驅(qū)無(wú)前驅(qū)) ) 根結(jié)點(diǎn)根結(jié)點(diǎn) ( (無(wú)前驅(qū)無(wú)前驅(qū)) )最后一個(gè)數(shù)據(jù)元素最后一個(gè)數(shù)據(jù)元素 (無(wú)后繼無(wú)后繼)多個(gè)葉子結(jié)點(diǎn)多個(gè)葉子結(jié)點(diǎn) ( (無(wú)后繼無(wú)后繼) )其它數(shù)據(jù)元素其它數(shù)據(jù)元素 ( (一個(gè)前驅(qū)、一個(gè)前驅(qū)、 一個(gè)后繼一個(gè)后繼) )其它數(shù)據(jù)元素其它數(shù)據(jù)元素 ( (一個(gè)前驅(qū)、一個(gè)前驅(qū)、 多個(gè)后繼多個(gè)后繼) )2022-5-2311基基 本本 術(shù)術(shù) 語(yǔ)語(yǔ)2022-5-2312結(jié)點(diǎn)結(jié)點(diǎn): :結(jié)點(diǎn)的度結(jié)點(diǎn)的度: :樹的度樹的度: :葉子結(jié)點(diǎn)葉子結(jié)點(diǎn): :
4、分支結(jié)點(diǎn)分支結(jié)點(diǎn): :數(shù)據(jù)元素?cái)?shù)據(jù)元素+ +若干指向子樹的分支若干指向子樹的分支分支的個(gè)數(shù)分支的個(gè)數(shù)樹中所有結(jié)點(diǎn)的度的最大值樹中所有結(jié)點(diǎn)的度的最大值度為零的結(jié)點(diǎn)度為零的結(jié)點(diǎn)度大于零的結(jié)點(diǎn)度大于零的結(jié)點(diǎn)DHIJM2022-5-2313( (從根到結(jié)點(diǎn)的從根到結(jié)點(diǎn)的) )路徑路徑:孩子孩子結(jié)點(diǎn)結(jié)點(diǎn)、雙親雙親結(jié)點(diǎn)結(jié)點(diǎn)、兄弟兄弟結(jié)點(diǎn)結(jié)點(diǎn)、堂兄弟堂兄弟祖先祖先結(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)所經(jīng)分支和結(jié)點(diǎn)構(gòu)成分支和結(jié)點(diǎn)構(gòu)成ABCDEFGHIJMKL假設(shè)根結(jié)點(diǎn)的層次為假設(shè)根結(jié)點(diǎn)的層次為1,1,第第l 層的結(jié)點(diǎn)的子樹根結(jié)點(diǎn)的層次為層的結(jié)
5、點(diǎn)的子樹根結(jié)點(diǎn)的層次為l+1樹中葉子結(jié)點(diǎn)所在的最大層次樹中葉子結(jié)點(diǎn)所在的最大層次2022-5-2314任何一棵非空樹是一個(gè)二元組任何一棵非空樹是一個(gè)二元組 Tree = (root,F(xiàn))其中:其中:root 被稱為根結(jié)點(diǎn),被稱為根結(jié)點(diǎn), F 被稱為子樹森林被稱為子樹森林森林森林:是是m(m0)棵互)棵互不相交的樹的集合不相交的樹的集合ArootBCDEFGHIJMKLF2022-5-23156.2 2022-5-2316二叉樹或?yàn)榭諛?;二叉樹或?yàn)榭諛洌?或是由一個(gè)根結(jié)點(diǎn)加上兩棵分別稱為或是由一個(gè)根結(jié)點(diǎn)加上兩棵分別稱為 左子樹左子樹和和右子樹右子樹的、的、 互不交的互不交的二叉樹組成。二叉樹組成
6、。ABCDEFGHK根結(jié)點(diǎn)根結(jié)點(diǎn)左子樹左子樹右子樹右子樹2022-5-2317NNNNLRRL空樹空樹只含根結(jié)點(diǎn)只含根結(jié)點(diǎn)右子樹為空樹右子樹為空樹左子樹為空樹左子樹為空樹左右子左右子樹均不樹均不為空樹為空樹二叉樹的五種基本形態(tài):二叉樹的五種基本形態(tài):2022-5-2318查 找 類插 入 類刪 除 類 二叉樹的主要基本操作二叉樹的主要基本操作2022-5-2319 Root(T); Value(T, e); Parent(T, e); LeftChild(T, e); RightChild(T, e); LeftSibling(T, e); RightSibling(T, e); BiTree
7、Empty(T); BiTreeDepth(T); PreOrderTraverse(T, Visit(); InOrderTraverse(T, Visit(); PostOrderTraverse(T, Visit(); LevelOrderTraverse(T, Visit();2022-5-2320 InitBiTree(&T); Assign(T, &e, value); CreateBiTree(&T, definition); InsertChild(T, p, LR, c);2022-5-2321ClearBiTree(&T); DestroyBiTree(&T);Delete
8、Child(T, p, LR);2022-5-2322二叉樹的重要特性2022-5-2323性質(zhì)1 : 在二叉樹的第在二叉樹的第 i 層上至多有層上至多有2i-1 個(gè)結(jié)點(diǎn)。個(gè)結(jié)點(diǎn)。 (i1)i = 1 層時(shí),只有一個(gè)根結(jié)點(diǎn),層時(shí),只有一個(gè)根結(jié)點(diǎn),2i-1 = 20 = 1;假設(shè)對(duì)所有的假設(shè)對(duì)所有的 j,1 j i,命題成立命題成立;二叉樹上每個(gè)結(jié)點(diǎn)至多有兩棵子樹,二叉樹上每個(gè)結(jié)點(diǎn)至多有兩棵子樹,則第則第 i 層的結(jié)點(diǎn)數(shù)層的結(jié)點(diǎn)數(shù) = 2i-2 2 = 2i-1 。2022-5-2324性質(zhì) 2 : 深度為深度為 k 的二叉樹上至多含的二叉樹上至多含 2k-1 個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn)(k1) 基于基于性質(zhì)
9、1,深度為,深度為 k 的二叉樹上的結(jié)的二叉樹上的結(jié)點(diǎn)數(shù)至多為點(diǎn)數(shù)至多為 20+21+ +2k-1 = 2k-1 2022-5-2325性質(zhì) 3 : 對(duì)任何一棵二叉樹,若它含有對(duì)任何一棵二叉樹,若它含有n0 個(gè)葉子結(jié)個(gè)葉子結(jié)點(diǎn)、點(diǎn)、n2 個(gè)度為個(gè)度為 2 的結(jié)點(diǎn),則必存在關(guān)系式:的結(jié)點(diǎn),則必存在關(guān)系式:n0 = n2+1設(shè)設(shè) 二叉樹上結(jié)點(diǎn)總數(shù)二叉樹上結(jié)點(diǎn)總數(shù) n = n0 + n1 + n2又又 二叉樹上分支總數(shù)二叉樹上分支總數(shù) b = n1+2n2 而而 b = n-1 = n0 + n1 + n2 - 1 由此,由此, n0 = n2 + 12022-5-2326滿二叉樹:深度為深度為k且
10、含有且含有2k-1個(gè)結(jié)點(diǎn)的個(gè)結(jié)點(diǎn)的二叉樹。二叉樹。完全二叉樹:樹中所樹中所含的含的 n 個(gè)結(jié)點(diǎn)和滿二個(gè)結(jié)點(diǎn)和滿二叉樹中叉樹中編號(hào)為編號(hào)為 1 至至 n 的結(jié)點(diǎn)的結(jié)點(diǎn)一一對(duì)應(yīng)。一一對(duì)應(yīng)。123456789 10 11 12 13 14 15abcdefghij兩類兩類特殊特殊的二叉樹:的二叉樹:2022-5-2327設(shè)設(shè) 完全二叉樹的深度為完全二叉樹的深度為 k 則根據(jù)則根據(jù)性質(zhì)2 得得 2k-1 n 2k 即即 k-1 log2 n n,則該結(jié)點(diǎn)無(wú)左孩子,則該結(jié)點(diǎn)無(wú)左孩子, 否則,編號(hào)為否則,編號(hào)為 2i 的結(jié)點(diǎn)為其的結(jié)點(diǎn)為其左孩子左孩子結(jié)點(diǎn);結(jié)點(diǎn);(3) 若若 2i+1n,則該結(jié)點(diǎn)無(wú)右孩子結(jié)
11、點(diǎn),則該結(jié)點(diǎn)無(wú)右孩子結(jié)點(diǎn), 否則,編號(hào)為否則,編號(hào)為2i+1 的結(jié)點(diǎn)為其的結(jié)點(diǎn)為其右孩子右孩子結(jié)點(diǎn)結(jié)點(diǎn)。性質(zhì) 5 :2022-5-2329二二. . 二叉樹的鏈?zhǔn)蕉鏄涞逆準(zhǔn)?存儲(chǔ)表示存儲(chǔ)表示一一. . 二叉樹的順序二叉樹的順序 存儲(chǔ)表示存儲(chǔ)表示 6.3 2022-5-2330#define MAX_TREE_SIZE 100 / 二叉樹的最大結(jié)點(diǎn)數(shù)二叉樹的最大結(jié)點(diǎn)數(shù)typedef TElemType SqBiTreeMAX_TREE_SIZE; / 0號(hào)單元存儲(chǔ)根結(jié)點(diǎn)號(hào)單元存儲(chǔ)根結(jié)點(diǎn)SqBiTree bt; 一一. . 二叉樹的順序存儲(chǔ)表示二叉樹的順序存儲(chǔ)表示2022-5-2331ABCDE
12、F2511437 A B D C E F 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14例如例如:2022-5-2332二二. . 二叉樹的鏈?zhǔn)酱鎯?chǔ)表示二叉樹的鏈?zhǔn)酱鎯?chǔ)表示2022-5-2333ADEBCF rootlchild data rchild1. 二叉鏈表ABCDEF2022-5-2334typedef struct BiTNode / 結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu) TElemType data; struct BiTNode *lchild, *rchild; / 左、右孩子指針左、右孩子指針 BiTNode, *BiTree;lchild data rchild結(jié)點(diǎn)結(jié)構(gòu)
13、結(jié)點(diǎn)結(jié)構(gòu):C 語(yǔ)言的類型描述如下語(yǔ)言的類型描述如下: :2022-5-2335ADEBCF root parent lchild data rchild結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu):2三叉鏈表2022-5-2336 typedef struct / TElemType data; struct TriTNode *lchild, *rchild; / 左、右孩子指針左、右孩子指針 struct TriTNode ; /雙親指針雙親指針 TriTNode, *TriTree; lchild data rchild結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu):C C 語(yǔ)言的類型描述如下語(yǔ)言的類型描述如下: :2022-5-2337LRR
14、RL0123456B2C0A -1D2E3F4 data parent LRTag3雙親鏈表ABCDEF2022-5-2338 typedef struct BPTNode / TElemType data; int parent; / 指向雙親的指針指向雙親的指針 char LRTag; / 左、右孩子標(biāo)志域左、右孩子標(biāo)志域 BPTNode typedef struct BPTree / 樹結(jié)構(gòu)樹結(jié)構(gòu) BPTNode nodesMAX_TREE_SIZE; int num_node; / 結(jié)點(diǎn)數(shù)目結(jié)點(diǎn)數(shù)目 int root; / 根結(jié)點(diǎn)的位置根結(jié)點(diǎn)的位置 BPTree2022-5-2339
15、6.46.42022-5-2340一一. . 問(wèn)題的提出問(wèn)題的提出二二. . 先左后右的遍歷算法先左后右的遍歷算法三三. . 算法的遞歸描述算法的遞歸描述四四. . 中序遍歷算法的非遞歸描述中序遍歷算法的非遞歸描述五五. . 遍歷算法的應(yīng)用舉例遍歷算法的應(yīng)用舉例2022-5-2341 順著某一條搜索路徑順著某一條搜索路徑巡訪巡訪二叉樹二叉樹中的結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)中的結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)均被訪問(wèn)一均被訪問(wèn)一次次,而且,而且僅被訪問(wèn)一次僅被訪問(wèn)一次。“”的含義可以很廣,如:輸出結(jié)的含義可以很廣,如:輸出結(jié)點(diǎn)的信息等。點(diǎn)的信息等。2022-5-2342 “遍歷遍歷”是任何類型均有的操作,是任何類型均有
16、的操作,對(duì)線性結(jié)構(gòu)而言,只有一條搜索路對(duì)線性結(jié)構(gòu)而言,只有一條搜索路徑徑(因?yàn)槊總€(gè)結(jié)點(diǎn)均只有一個(gè)后繼因?yàn)槊總€(gè)結(jié)點(diǎn)均只有一個(gè)后繼),故不需要另加討論。而二叉樹是非故不需要另加討論。而二叉樹是非線性結(jié)構(gòu),每個(gè)結(jié)點(diǎn)有兩個(gè)后繼,線性結(jié)構(gòu),每個(gè)結(jié)點(diǎn)有兩個(gè)后繼,則存在如何遍歷即按什么樣的則存在如何遍歷即按什么樣的搜索搜索路徑路徑遍歷的問(wèn)題。遍歷的問(wèn)題。2022-5-2343 對(duì)對(duì)“二叉樹二叉樹”而言,而言,可以有三條搜索路徑:可以有三條搜索路徑:1先上后下先上后下的按層次遍歷;的按層次遍歷;2先左先左(子樹子樹)后右后右(子樹子樹)的遍歷;的遍歷;3先右先右(子樹子樹)后左后左(子樹子樹)的遍歷。的遍歷。
17、NRL2022-5-2344先先(根)序的遍歷算法(根)序的遍歷算法中中(根)序的遍歷算法(根)序的遍歷算法后后(根)序的遍歷算法(根)序的遍歷算法2022-5-2345 若二叉樹為空樹,則空操作;否則,若二叉樹為空樹,則空操作;否則,(1)訪問(wèn)根結(jié)點(diǎn);)訪問(wèn)根結(jié)點(diǎn);(2)先序遍歷左子樹;)先序遍歷左子樹;(3)先序遍歷右子樹。)先序遍歷右子樹。2022-5-2346 若二叉樹為空樹,則空操作;否則,若二叉樹為空樹,則空操作;否則,(1)中序遍歷左子樹;)中序遍歷左子樹;(2)訪問(wèn)根結(jié)點(diǎn);)訪問(wèn)根結(jié)點(diǎn);(3)中序遍歷右子樹。)中序遍歷右子樹。2022-5-2347 若二叉樹為空樹,則空操作;否
18、則,若二叉樹為空樹,則空操作;否則,(1)后序遍歷左子樹;)后序遍歷左子樹;(2)后序遍歷右子樹;)后序遍歷右子樹;(3)訪問(wèn)根結(jié)點(diǎn)。)訪問(wèn)根結(jié)點(diǎn)。2022-5-2348- -c*ba 2022-5-2349void Preorder (BiTree T, void( *visit)(TElemType& e) / 先序遍歷二叉樹先序遍歷二叉樹 if (T) visit(T-data); / 訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn) Preorder(T-lchild, visit); / 遍歷左子樹遍歷左子樹 Preorder(T-rchild, visit);/ 遍歷右子樹遍歷右子樹 2022-5-2350BiT
19、Node *GoFarLeft(BiTree T, Stack &S) if (!T ) return NULL; while (T-lchild ) / 直到最左端直到最左端 Push(S, T); T = T-lchild; return T;abcdefghij2022-5-2351void Inorder_I( BiTree T, void (*visit)(TelemType& e) ) Stack S; InitStack(S); t = GoFarLeft(T, S); / 找到最左下的結(jié)點(diǎn)找到最左下的結(jié)點(diǎn) while (t) visit(t-data); if (t-rchil
20、d) t = GoFarLeft(t-rchild, S); else if (!StackEmpty(S ) / 棧不空時(shí)退棧棧不空時(shí)退棧 t = Pop(S); else t = NULL; / ??毡砻鞅闅v結(jié)束棧空表明遍歷結(jié)束 2022-5-23521. 統(tǒng)計(jì)二叉樹中葉子結(jié)點(diǎn)的個(gè)數(shù)統(tǒng)計(jì)二叉樹中葉子結(jié)點(diǎn)的個(gè)數(shù) (先序遍歷,先序遍歷, 習(xí)題習(xí)題6.42)2. 求二叉樹的深度求二叉樹的深度 (后序遍歷,后序遍歷,參見參見習(xí)題習(xí)題6.44)3. 復(fù)制二叉樹復(fù)制二叉樹 (后序遍歷,后序遍歷,參見參見習(xí)題習(xí)題6.46)4.4.建立二叉樹的存儲(chǔ)結(jié)構(gòu)建立二叉樹的存儲(chǔ)結(jié)構(gòu)2022-5-2353算法基本思想
21、: 先序先序( (或中序或后序或中序或后序) )遍歷二叉樹,在遍歷二叉樹,在遍歷過(guò)程中查找葉子結(jié)點(diǎn),并計(jì)數(shù)。遍歷過(guò)程中查找葉子結(jié)點(diǎn),并計(jì)數(shù)。 因此,需在遍歷算法中增添一個(gè)因此,需在遍歷算法中增添一個(gè)“計(jì)計(jì)數(shù)數(shù)”的參數(shù),并將算法中的參數(shù),并將算法中“訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn)”的的操作改為操作改為: :若是葉子,則計(jì)數(shù)器增若是葉子,則計(jì)數(shù)器增1 1。1. 統(tǒng)計(jì)二叉樹中葉子結(jié)點(diǎn)的個(gè)數(shù)統(tǒng)計(jì)二叉樹中葉子結(jié)點(diǎn)的個(gè)數(shù)(習(xí)題習(xí)題6.42)2022-5-2354void CountLeaf count if ( T ) /初值為初值為0 if (!T-lchild & !T-rchild) count+; / 對(duì)葉子結(jié)
22、點(diǎn)計(jì)數(shù)對(duì)葉子結(jié)點(diǎn)計(jì)數(shù) CountLeaf CountLeaf 2022-5-2355算法基本思想: “訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn)”的操作為的操作為: :求得左、求得左、右子樹深度的最大值,然后加右子樹深度的最大值,然后加 1 1 。 首先分析二叉樹的深度和它的左、首先分析二叉樹的深度和它的左、右子樹深度之間的關(guān)系。右子樹深度之間的關(guān)系。2. 求二叉樹的深度求二叉樹的深度(后序遍歷后序遍歷) (參見(參見)2022-5-2356int Depth / 返回二叉樹的深度返回二叉樹的深度 if ( !T ) depthval = 0; else depthLeft = Depth depthRight= De
23、pth depthval = 1 + (depthLeft depthRight ? depthLeft : depthRight); return depthval;2022-5-2357根元素根元素T左子樹左子樹右子樹右子樹(后序遍歷后序遍歷)3. 復(fù)制二叉樹復(fù)制二叉樹(參見(參見習(xí)題習(xí)題6.46)2022-5-2358BiTNode *GetTreeNode(TElemType item, BiTNode *lptr , BiTNode *rptr ) if (!(T = (BiTNode*)malloc(sizeof(BiTNode) exit(1); T- data = item;
24、T- lchild = lptr; T- rchild = rptr; return T; 生成二叉樹的一個(gè)結(jié)點(diǎn)生成二叉樹的一個(gè)結(jié)點(diǎn)(其數(shù)據(jù)域?yàn)槠鋽?shù)據(jù)域?yàn)閕tem,左指針域?yàn)樽笾羔樣驗(yàn)閘ptr,右指針域?yàn)橛抑羔樣驗(yàn)閞ptr)2022-5-2359BiTNode *CopyTree if (!T ) return NULL; if (T-lchild ) newlptr = CopyTree;/復(fù)制左子樹復(fù)制左子樹 else newlptr = NULL; if (T-rchild ) newrptr = CopyTree;/復(fù)制右子樹復(fù)制右子樹 else newrptr = NULL; new
25、T=GetTreeNode(T-data,newlptr,newrptr); return newT;問(wèn)題問(wèn)題:2022-5-2360 B ABCDEFGHK D C H K G F E A例如: :下列二叉樹下列二叉樹的復(fù)制過(guò)程如下的復(fù)制過(guò)程如下: :2022-5-23614. 4. 建立二叉樹的建立二叉樹的 存儲(chǔ)結(jié)構(gòu)存儲(chǔ)結(jié)構(gòu)2022-5-2362 以字符串的形式以字符串的形式 根根 左子樹左子樹 右子樹右子樹 定義一棵二叉樹定義一棵二叉樹例如: :ABCD以空白字符以空白字符“ ”“ ”表示表示A(B( ,C( , ),D( , )空樹空樹只含一個(gè)根結(jié)點(diǎn)只含一個(gè)根結(jié)點(diǎn)的二叉樹的二叉樹A以字
26、符串以字符串“A ” ”表示表示以下列字符串表示以下列字符串表示2022-5-2363Status CreateBiTree scanf(&ch); if (ch= ) T = NULL; else if (!(T=(BiTNode*)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; / 生成根結(jié)點(diǎn)生成根結(jié)點(diǎn) CreateBiTree- / 構(gòu)造左子樹構(gòu)造左子樹 CreateBiTree / 構(gòu)造右子樹構(gòu)造右子樹 return OK; 2022-5-2364A B C D A BCD上頁(yè)算法執(zhí)行過(guò)程舉例如下上頁(yè)算法執(zhí)行過(guò)程舉例如下: :AT
27、BCD2022-5-2365 按給定的表達(dá)式建相應(yīng)二叉樹按給定的表達(dá)式建相應(yīng)二叉樹 由先綴表示式建樹由先綴表示式建樹例如:已知表達(dá)式的先綴表示式例如:已知表達(dá)式的先綴表示式 - -+ + a b c / d e 由原表達(dá)式建樹由原表達(dá)式建樹例如:已知表達(dá)式例如:已知表達(dá)式 (a+b)c d/ed/e2022-5-2366對(duì)應(yīng)先綴表達(dá)式對(duì)應(yīng)先綴表達(dá)式 - -+ + a b c / d e的二叉樹的二叉樹abcde- -+/特點(diǎn)特點(diǎn): 操作數(shù)操作數(shù)為葉子結(jié)點(diǎn),為葉子結(jié)點(diǎn), 運(yùn)算符運(yùn)算符為分支結(jié)點(diǎn)為分支結(jié)點(diǎn)2022-5-2367scanf(&ch);if ( In(ch, 字母集字母集 ) 建葉子結(jié)
28、點(diǎn)建葉子結(jié)點(diǎn);else 建根結(jié)點(diǎn)建根結(jié)點(diǎn); 遞歸建左子樹遞歸建左子樹; 遞歸建右子樹遞歸建右子樹;由先綴表示式建樹的算法的基本操作:由先綴表示式建樹的算法的基本操作:2022-5-2368a+b(a+b)c d/e d/ea+bc 分析表達(dá)式和二叉樹的關(guān)系分析表達(dá)式和二叉樹的關(guān)系:ab+abc+abc+(a+b)cabcde- -+/2022-5-2369基本操作基本操作:scanf(&ch);if (In(ch, 字母集字母集 ) 建葉子結(jié)點(diǎn)建葉子結(jié)點(diǎn); 暫存暫存; else if (In(ch, 運(yùn)算符集運(yùn)算符集) 和前一個(gè)運(yùn)算符比較優(yōu)先數(shù)和前一個(gè)運(yùn)算符比較優(yōu)先數(shù); 若當(dāng)前的優(yōu)先數(shù)若當(dāng)前的
29、優(yōu)先數(shù)“高高”,則暫存,則暫存; 否則建子樹否則建子樹; 2022-5-2370void CrtExptree(BiTree &T, char exp ) InitStack(S); Push(S, # ); InitStack(PTR); p = exp; ch = *p; while (!(GetTop(S)= # & ch= # ) if (!IN(ch, OP) CrtNode( t, ch ); / 建葉子結(jié)點(diǎn)并入棧建葉子結(jié)點(diǎn)并入棧 else if ( ch!= # ) p+; ch = *p; Pop(PTR, T); 2022-5-2371switch (ch) case ( :
30、 Push(S, ch); break; case ) : Pop(S, c); while (c!= ( ) CrtSubtree( t, c); /建二叉樹并入棧建二叉樹并入棧 Pop(S, c); break; defult : / switch 2022-5-2372while(!Gettop(S, c) & ( precede(c,ch) CrtSubtree( t, c); Pop(S, c);if ( ch!= # ) Push( S, ch); break;2022-5-2373建葉子結(jié)點(diǎn)的算法為:建葉子結(jié)點(diǎn)的算法為:void CrtNode(BiTree& T,char ch
31、) T=(BiTNode*)malloc(sizeof(BiTNode); T-data = char; T-lchild = T-rchild = NULL; Push( PTR, T );2022-5-2374建子樹的算法為:建子樹的算法為:void CrtSubtree (Bitree& T, char c) T=(BiTNode*)malloc(sizeof(BiTNode); T-data = c; Pop(PTR, rc); T-rchild = rc; Pop(PTR, lc); T-lchild = lc; Push(PTR, T);2022-5-2375 僅知二叉樹的先序序列
32、僅知二叉樹的先序序列“abcdefg” 不能唯一確定一棵二叉樹,不能唯一確定一棵二叉樹, 如果同時(shí)已知二叉樹的中序序列如果同時(shí)已知二叉樹的中序序列“cbdaegf”, 則會(huì)如何?則會(huì)如何? 二叉樹的先序序列二叉樹的先序序列二叉樹的中序序列二叉樹的中序序列左子樹左子樹左子樹左子樹右子樹右子樹右子樹右子樹根根根根2022-5-2376a b c d e f gc b d a e g f例如例如: :aab bccddeeffggabcdefg先序序列先序序列中序序列中序序列2022-5-2377void CrtBT(BiTree& T, char pre, char ino, int ps, in
33、t is, int n ) / 已知已知preps.ps+n-1為二叉樹的先序序列為二叉樹的先序序列, / insis.is+n-1為二叉樹的中序序列為二叉樹的中序序列, /本算法由此兩個(gè)序列構(gòu)造二叉鏈表本算法由此兩個(gè)序列構(gòu)造二叉鏈表 if (n=0) T=NULL; else k=Search(ino, preps);/在中序序列中查詢?cè)谥行蛐蛄兄胁樵?if (k= -1) T=NULL; else 2022-5-2378T=(BiTNode*)malloc(sizeof(BiTNode);T-data = preps;if (k=is) T-Lchild = NULL;else CrtBT
34、(T-Lchild, pre, ino, ps+1, is, k-is );if (k=is+n-1) T-Rchild = NULL;else CrtBT(T-Rchild, pre, ino, ps+1+(k-is), k+1, n-(k-is)-1 );2022-5-23796.56.5 線索二叉樹線索二叉樹 何謂線索二叉樹?何謂線索二叉樹? 線索鏈表的遍歷算法線索鏈表的遍歷算法 如何建立線索鏈表?如何建立線索鏈表?2022-5-2380遍歷二叉樹的結(jié)果是,遍歷二叉樹的結(jié)果是, 求得結(jié)點(diǎn)的一個(gè)線性序列。求得結(jié)點(diǎn)的一個(gè)線性序列。ABCDEFGHK例如例如: :先序序列先序序列: : A B
35、 C D E F G H K中序序列中序序列: : B D C A H G K F E后序序列后序序列: : D C B H K G F E A一一. 何謂線索二叉樹?何謂線索二叉樹?2022-5-2381與其相應(yīng)的二叉樹,與其相應(yīng)的二叉樹,稱作稱作 “線索二叉樹線索二叉樹”包含包含 “線索線索” 的存儲(chǔ)的存儲(chǔ)結(jié)構(gòu),稱作結(jié)構(gòu),稱作 “線索鏈線索鏈表表”A B C D E F G H K D C B E 2022-5-2382 在二叉鏈表的結(jié)點(diǎn)中在二叉鏈表的結(jié)點(diǎn)中增加兩個(gè)標(biāo)志增加兩個(gè)標(biāo)志域域,并作如下規(guī)定:,并作如下規(guī)定:若該結(jié)點(diǎn)的左子樹不空,若該結(jié)點(diǎn)的左子樹不空,則則Lchild域的指針指向其
36、左子樹,域的指針指向其左子樹, 且左標(biāo)志域的值為且左標(biāo)志域的值為“指針指針 Link”; 否則,否則,Lchild域的指針指向其域的指針指向其“前驅(qū)前驅(qū)”, 且左標(biāo)志的值為且左標(biāo)志的值為“線索線索 Thread” 。2022-5-2383若該結(jié)點(diǎn)的右子樹不空,若該結(jié)點(diǎn)的右子樹不空,則則rchild域的指針指向其右子樹,域的指針指向其右子樹, 且右標(biāo)志域的值為且右標(biāo)志域的值為 “指針指針 Link”;否則,否則,rchild域的指針指向其域的指針指向其“后繼后繼”, 且右標(biāo)志的值為且右標(biāo)志的值為“線索線索 Thread”。 如此定義的二叉樹的存儲(chǔ)結(jié)構(gòu)稱作如此定義的二叉樹的存儲(chǔ)結(jié)構(gòu)稱作“線索鏈表線
37、索鏈表”2022-5-2384typedef struct BiThrNod TElemType data; struct BiThrNode *lchild,*rchild; /左右指針左右指針 PointerThr LTag, RTag; / 左右標(biāo)志左右標(biāo)志 BiThrNode, *BiThrTree; typedef enum Link, Thread PointerThr; / Link=0:指針,指針,Thread=1:線索線索2022-5-2385 for ( p=firstNode(T); p; p=Succ(p) ) Visit (p);由于在線索鏈表中添加了遍歷中得到的由于
38、在線索鏈表中添加了遍歷中得到的“前驅(qū)前驅(qū)”和和“后繼后繼”的信息,從而簡(jiǎn)化的信息,從而簡(jiǎn)化了遍歷的算法。了遍歷的算法。二二. . 線索鏈表的遍歷算法線索鏈表的遍歷算法2022-5-2386例如例如: 對(duì)中序線索化鏈表的遍歷算法對(duì)中序線索化鏈表的遍歷算法 中序遍歷的第一個(gè)結(jié)點(diǎn)?中序遍歷的第一個(gè)結(jié)點(diǎn)? 在中序線索化鏈表中結(jié)點(diǎn)的后繼?在中序線索化鏈表中結(jié)點(diǎn)的后繼?左子樹上處于左子樹上處于“最左下最左下”(沒(méi)有左子樹)(沒(méi)有左子樹)的結(jié)點(diǎn)的結(jié)點(diǎn)若若無(wú)右子樹,無(wú)右子樹,則為則為后繼線索所指結(jié)點(diǎn)后繼線索所指結(jié)點(diǎn)否則為否則為對(duì)其右子樹進(jìn)行中序遍歷時(shí)對(duì)其右子樹進(jìn)行中序遍歷時(shí)訪問(wèn)的第一個(gè)結(jié)點(diǎn)訪問(wèn)的第一個(gè)結(jié)點(diǎn)20
39、22-5-2387void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e) p = T-lchild; / p指向根結(jié)點(diǎn)指向根結(jié)點(diǎn) while (p != T) / 空樹或遍歷結(jié)束時(shí),空樹或遍歷結(jié)束時(shí),p=T while (p-LTag=Link) p=p-lchild; /第一個(gè)結(jié)點(diǎn)第一個(gè)結(jié)點(diǎn) Visit(p-data); / 訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn) while (p-RTag=Thread & p-rchild!=T) p = p-rchild; Visit(p-data); / 訪問(wèn)后繼結(jié)點(diǎn)訪問(wèn)后繼結(jié)點(diǎn) p = p-rch
40、ild; / p進(jìn)至其右子樹根進(jìn)至其右子樹根 2022-5-2388 在中序遍歷過(guò)程中修改結(jié)點(diǎn)的在中序遍歷過(guò)程中修改結(jié)點(diǎn)的左、右指針域,以保存當(dāng)前訪問(wèn)結(jié)左、右指針域,以保存當(dāng)前訪問(wèn)結(jié)點(diǎn)的點(diǎn)的“前驅(qū)前驅(qū)”和和“后繼后繼”信息。遍歷過(guò)信息。遍歷過(guò)程中,附設(shè)指針程中,附設(shè)指針pre, 并始終保持指并始終保持指針針pre指向當(dāng)前訪問(wèn)的、指針指向當(dāng)前訪問(wèn)的、指針p所指所指結(jié)點(diǎn)的前驅(qū)。結(jié)點(diǎn)的前驅(qū)。三三. 如何建立線索鏈表?如何建立線索鏈表?2022-5-2389void InThreading(BiThrTree p) if (p) InThreading(p-lchild); if (!p-lchild
41、) p-LTag = Thread; p-lchild = pre; if (!pre-rchild) pre-RTag = Thread; pre-rchild = p; pre = p; InThreading(p-rchild); 2022-5-2390Status InOrderThreading(BiThrTree &Thrt, BiThrTree T) if (!(Thrt = (BiThrTree)malloc( sizeof( BiThrNode) exit (OVERFLOW); Thrt-LTag = Link; Thrt-RTag=Thread; Thrt-rchild
42、= Thrt; return OK; 2022-5-2391if (!T) Thrt-lchild = Thrt; else Thrt-lchild = T; pre = Thrt; InThreading(T); pre-rchild = Thrt; /處理最后一個(gè)結(jié)點(diǎn)處理最后一個(gè)結(jié)點(diǎn) pre-RTag = Thread; Thrt-rchild = pre; 2022-5-239200A00C00B11E11F11G00D11I11H注:此圖中序遍歷結(jié)果為注:此圖中序遍歷結(jié)果為: : H, D, I, B, E, A, F, C, G0root0某二叉樹存儲(chǔ)結(jié)構(gòu)如圖所示:某二叉樹存儲(chǔ)結(jié)構(gòu)如
43、圖所示:00A00C00B11E11F11G00D11I11H對(duì)應(yīng)的中序線索化對(duì)應(yīng)的中序線索化12022-5-2393 6.6 2022-5-2394一一. 雙親表示法雙親表示法二二. 孩子鏈表表示法孩子鏈表表示法三三. 樹的二叉鏈表樹的二叉鏈表( (孩子孩子- -兄弟)兄弟) 存儲(chǔ)表示法存儲(chǔ)表示法樹的三種存儲(chǔ)結(jié)構(gòu)2022-5-2395ABCDEFGr=0n=70 A -11 B 02 C 03 D 04 E 2 5 F 26 G 5data parent一一. 雙親表示法雙親表示法2022-5-2396 typedef struct PTNode ElemType data; int par
44、ent; / 雙親位置域 PTNode; data parent#define MAX_TREE_SIZE 100結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu):C語(yǔ)言的類型描述語(yǔ)言的類型描述: :2022-5-2397typedef struct PTNode nodesMAX_TREE_SIZE; int r, n; / 根結(jié)點(diǎn)的位置和結(jié)點(diǎn)個(gè)數(shù) PTree;樹結(jié)構(gòu):2022-5-2398ABCDEFG0 A -11 B 02 C 03 D 04 E 25 F 26 G 4r=0n=7 data firstchild 1 2 34 56-1 0 0 0 2 2 4二二. 孩子鏈表表示法孩子鏈表表示法2022-5-2399
45、typedef struct CTNode int child; struct CTNode *next; *ChildPtr;孩子結(jié)點(diǎn)結(jié)構(gòu)孩子結(jié)點(diǎn)結(jié)構(gòu): child nextC語(yǔ)言的類型描述語(yǔ)言的類型描述: :2022-5-23100 typedef struct ElemType data; ChildPtr firstchild; / 孩子鏈的頭指針 CTBox;雙親結(jié)點(diǎn)結(jié)構(gòu)雙親結(jié)點(diǎn)結(jié)構(gòu) data firstchild2022-5-23101typedef struct CTBox nodesMAX_TREE_SIZE; int n, r; / 結(jié)點(diǎn)數(shù)和根結(jié)點(diǎn)的位置 CTree;樹結(jié)構(gòu):
46、2022-5-23102ABCDEFG AB C E D F G AB C E D F G 2022-5-23103typedef struct CSNode ElemType data; struct CSNode *firstchild, *nextsibling; CSNode, *CSTree;C語(yǔ)言的類型描述語(yǔ)言的類型描述: :結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu): firstchild data nextsibling2022-5-23104設(shè)設(shè)森林森林 F = ( T1, T2, , Tn ); T1 = (root,t11, t12, , t1m);二叉樹二叉樹 B =( LBT, Node(ro
47、ot), RBT );2022-5-23105由森林轉(zhuǎn)換成二叉樹由森林轉(zhuǎn)換成二叉樹的轉(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。2022-5-23106由二叉樹轉(zhuǎn)換為森林由二叉樹轉(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)。2022-5-2310
48、7 由此,樹的各種操作均可由由此,樹的各種操作均可由對(duì)應(yīng)二叉樹的操作來(lái)完成。對(duì)應(yīng)二叉樹的操作來(lái)完成。 注意:和樹對(duì)應(yīng)的二叉樹,其和樹對(duì)應(yīng)的二叉樹,其左、右子樹的概念已改變?yōu)椋鹤?、右子樹的概念已改變?yōu)椋?左是孩子,右是兄弟左是孩子,右是兄弟2022-5-231082022-5-231092022-5-23110按層次遍歷按層次遍歷:先根先根(次序次序)遍歷遍歷:后根后根(次序次序)遍歷遍歷: 若樹不空,則先訪問(wèn)根結(jié)點(diǎn),然后若樹不空,則先訪問(wèn)根結(jié)點(diǎn),然后依次先根遍歷各棵子樹。依次先根遍歷各棵子樹。 若樹不空,則先依次后根遍歷各棵若樹不空,則先依次后根遍歷各棵子樹,然后訪問(wèn)根結(jié)點(diǎn)。子樹,然后訪問(wèn)根結(jié)
49、點(diǎn)。 若樹不空,則自上而下自左至右若樹不空,則自上而下自左至右訪問(wèn)樹中每個(gè)結(jié)點(diǎn)。訪問(wèn)樹中每個(gè)結(jié)點(diǎn)。2022-5-23111 A B C DE F G H I J K 先根遍歷時(shí)頂點(diǎn)先根遍歷時(shí)頂點(diǎn)的訪問(wèn)次序:的訪問(wèn)次序:A B E F C D G H I J K 后根遍歷時(shí)頂點(diǎn)后根遍歷時(shí)頂點(diǎn)的訪問(wèn)次序:的訪問(wèn)次序:E F B C I J K H G D A 層次遍歷時(shí)頂點(diǎn)層次遍歷時(shí)頂點(diǎn)的訪問(wèn)次序:的訪問(wèn)次序:A B C D E F G H I J K2022-5-231121. 森林中第一棵樹森林中第一棵樹的根結(jié)點(diǎn);的根結(jié)點(diǎn);2. 森林中第一棵森林中第一棵樹的子樹森林;樹的子樹森林;3. 森林中
50、其它樹構(gòu)森林中其它樹構(gòu)成的森林。成的森林。森林由三部分構(gòu)成:森林由三部分構(gòu)成: B C DE F G H I J K2022-5-231131.1.先序遍歷先序遍歷 若森林不空,則若森林不空,則訪問(wèn)森林中第一棵樹的根結(jié)點(diǎn)訪問(wèn)森林中第一棵樹的根結(jié)點(diǎn);先序遍歷先序遍歷森林中第一棵樹的子樹森林森林中第一棵樹的子樹森林;先序遍歷先序遍歷森林中森林中(除第一棵樹之外除第一棵樹之外)其其 余樹構(gòu)成的森林。余樹構(gòu)成的森林。即:依次從左至右對(duì)森林中的每一棵即:依次從左至右對(duì)森林中的每一棵樹樹進(jìn)行進(jìn)行先根遍歷先根遍歷。2022-5-231142.2.中序遍歷中序遍歷 若森林不空,則若森林不空,則中序遍歷中序遍歷
51、森林中第一棵樹的子樹森林森林中第一棵樹的子樹森林;訪問(wèn)森林中第一棵樹的根結(jié)點(diǎn)訪問(wèn)森林中第一棵樹的根結(jié)點(diǎn);中序遍歷中序遍歷森林中森林中(除第一棵樹之外除第一棵樹之外)其其 余樹構(gòu)成的森林。余樹構(gòu)成的森林。即:依次從左至右對(duì)森林中的每一棵即:依次從左至右對(duì)森林中的每一棵樹樹進(jìn)行進(jìn)行后根遍歷后根遍歷。2022-5-23115先根遍歷先根遍歷后根遍歷后根遍歷樹樹二叉樹二叉樹森林森林先序遍歷先序遍歷先序遍歷先序遍歷中序遍歷中序遍歷中序遍歷中序遍歷 樹的遍歷和二叉樹遍歷的樹的遍歷和二叉樹遍歷的對(duì)應(yīng)關(guān)系對(duì)應(yīng)關(guān)系 ?2022-5-23116typedef struct CSNode Elem data; st
52、ruct CSNode *firstchild, *nextsibling; CSNode, *CSTree; 2022-5-23117int TreeDepth(CSTree T) if (!T) return 0; else h1 = TreeDepth( T-firstchild ); h2 = TreeDepth( T-nextsibling); / TreeDepthreturn(max(h1+1, h2);2022-5-23118 A B C DE F G H I J K例如:對(duì)左圖所示的樹,例如:對(duì)左圖所示的樹,其輸出結(jié)果應(yīng)為:其輸出結(jié)果應(yīng)為:A B EA B FA CA D G
53、 H IA D G H JA D G H K2022-5-23119void AllPath( BiTree T, Stack& S ) / 輸出二叉樹上從根到所有葉子結(jié)點(diǎn)的路徑輸出二叉樹上從根到所有葉子結(jié)點(diǎn)的路徑 if (T) Push( S, T-data ); ; else AllPath( T-lchild, S ); AllPath( T-rchild, S ); Pop(S); / if(T)2022-5-23120void OutPath( CSTree T, Stack& S ) while ( T ) Push(S, T-data ); else OutPath( T-fir
54、stchild, S ); Pop(S); T = T-nextsibling; / while / OutPath/ 輸出森林中所有從根到葉的路徑輸出森林中所有從根到葉的路徑2022-5-23121 和二叉樹類似,不同的定義相應(yīng)和二叉樹類似,不同的定義相應(yīng)有不同的算法。有不同的算法。 假設(shè)以二元組假設(shè)以二元組(F,C)的形式自上而下、的形式自上而下、自左而右依次輸入樹的各邊,建立樹的自左而右依次輸入樹的各邊,建立樹的孩子孩子-兄弟鏈表。兄弟鏈表。2022-5-23122ABCDEFG例如:對(duì)下列所示樹的輸入序列應(yīng)為對(duì)下列所示樹的輸入序列應(yīng)為: :(#, A)(A, B)(A, C)(A, D
55、)(C, E)(C, F)(E, G)ABCD(#, A)(A, B)(A, C)(A, D)(C, E)可見,算法中需要可見,算法中需要一個(gè)隊(duì)列保存已建一個(gè)隊(duì)列保存已建好的結(jié)點(diǎn)的指針好的結(jié)點(diǎn)的指針2022-5-23123void CreateTree( CSTree &T ) T = NULL; for( scanf(&fa, &ch); ch!= ; scanf(&fa, &ch) p = GetTreeNode(ch); / 創(chuàng)建結(jié)點(diǎn)創(chuàng)建結(jié)點(diǎn)EnQueue(Q, p); / 指針入隊(duì)列指針入隊(duì)列if (fa = ) T = p; / 所建為根結(jié)點(diǎn)所建為根結(jié)點(diǎn) else / 非根結(jié)點(diǎn)的情況
56、非根結(jié)點(diǎn)的情況 / for / CreateTree 2022-5-23124GetHead(Q,s); / 取隊(duì)列頭元素取隊(duì)列頭元素(指針值指針值)while (s-data != fa ) / 查詢雙親結(jié)點(diǎn)查詢雙親結(jié)點(diǎn) DeQueue(Q,s); GetHead(Q,s); if (!(s-firstchild) s-firstchild = p; r = p; / 鏈接第一個(gè)孩子結(jié)點(diǎn)鏈接第一個(gè)孩子結(jié)點(diǎn)else r-nextsibling = p; r = p; / 鏈接其它孩子結(jié)點(diǎn)鏈接其它孩子結(jié)點(diǎn) 2022-5-231256.8 哈夫曼樹與哈夫曼樹與 最優(yōu)樹的定義 如何構(gòu)造最優(yōu)樹 前綴編
57、碼 2022-5-23126樹的路徑長(zhǎng)度樹的路徑長(zhǎng)度定義為:定義為: 樹中每個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和。樹中每個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和。 結(jié)點(diǎn)的路徑長(zhǎng)度結(jié)點(diǎn)的路徑長(zhǎng)度定義為:定義為: 從根結(jié)點(diǎn)到該結(jié)點(diǎn)的路徑上從根結(jié)點(diǎn)到該結(jié)點(diǎn)的路徑上 分支的數(shù)目。分支的數(shù)目。2022-5-23127 樹的帶權(quán)路徑長(zhǎng)度樹的帶權(quán)路徑長(zhǎng)度定義為:定義為: 樹中所有葉子樹中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和之和 WPL(T) = wklk (對(duì)所有葉子結(jié)點(diǎn)對(duì)所有葉子結(jié)點(diǎn)) 在所有含在所有含 n 個(gè)葉子結(jié)點(diǎn)、并帶相同權(quán)個(gè)葉子結(jié)點(diǎn)、并帶相同權(quán)值的值的 m 叉樹中,必存在一棵其叉樹中,必存在一棵其帶權(quán)路徑帶權(quán)路徑長(zhǎng)度取最
58、小值長(zhǎng)度取最小值的樹,稱為的樹,稱為“最優(yōu)樹最優(yōu)樹”。例如:2022-5-2312827549WPL(T) = 7 2+5 2+2 3+4 3+9 2 = 60WPL(T) = 7 4+9 4+5 3+4 2+2 1 = 89 7 9 2542022-5-23129 根據(jù)給定的根據(jù)給定的 n 個(gè)權(quán)值個(gè)權(quán)值 w1, w2, , wn, 構(gòu)造構(gòu)造 n 棵二叉樹的集合棵二叉樹的集合 F = T1, T2, , Tn, 其中每棵二叉樹其中每棵二叉樹Ti均只含一個(gè)帶權(quán)值均只含一個(gè)帶權(quán)值 wi 的根結(jié)點(diǎn)(左、右子樹均為空樹)的根結(jié)點(diǎn)(左、右子樹均為空樹);(1)(哈夫曼算法哈夫曼算法) 以二叉樹為例以二叉
59、樹為例:2022-5-23130 在在 F 中選取其根的權(quán)值最小的中選取其根的權(quán)值最小的 兩棵二叉樹,分別作為左、右兩棵二叉樹,分別作為左、右 子樹構(gòu)造一棵新的二叉樹,并子樹構(gòu)造一棵新的二叉樹,并 置這棵新的二叉樹的根權(quán)值為置這棵新的二叉樹的根權(quán)值為 其左、右子樹的根權(quán)值之和其左、右子樹的根權(quán)值之和; (2)2022-5-23131 從從F中刪去這兩棵樹,同時(shí)加入中刪去這兩棵樹,同時(shí)加入 剛生成的新樹剛生成的新樹; 重復(fù)重復(fù) (2) 和和 (3) 兩步,直至兩步,直至 F 中只中只 含一棵樹為止。含一棵樹為止。(3)(4)2022-5-231329例如例如: : 已知權(quán)值已知權(quán)值 W= 5,
60、6, 2, 9, 7 5627527697671395272022-5-2313367139527952716671329000011110001101101112022-5-23134 指的是,任何一個(gè)字符的編碼都指的是,任何一個(gè)字符的編碼都不是同一字符集中另一個(gè)字符的編碼不是同一字符集中另一個(gè)字符的編碼的前綴。的前綴。 利用哈夫曼樹可以構(gòu)造一種不等利用哈夫曼樹可以構(gòu)造一種不等長(zhǎng)的二進(jìn)制編碼,并且構(gòu)造所得的長(zhǎng)的二進(jìn)制編碼,并且構(gòu)造所得的哈哈夫曼編碼夫曼編碼是一種是一種最優(yōu)前綴編碼最優(yōu)前綴編碼,即使,即使所傳所傳電文的總長(zhǎng)度最短電文的總長(zhǎng)度最短。2022-5-23135HuffmanHuffm
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)器學(xué)習(xí)在合規(guī)檢查中的應(yīng)用
- 2026年消防安全員操作技能測(cè)試題火災(zāi)預(yù)防與應(yīng)急處置
- 2026年環(huán)境心理學(xué)與公共空間設(shè)計(jì)應(yīng)用問(wèn)題集
- 2026年外貿(mào)業(yè)務(wù)員國(guó)際商務(wù)知識(shí)測(cè)試題集
- 2026年機(jī)械工程師機(jī)械設(shè)計(jì)與制造技術(shù)問(wèn)題庫(kù)
- 2026年醫(yī)學(xué)考試寶典醫(yī)學(xué)基礎(chǔ)知識(shí)與臨床實(shí)踐題集
- 2026年環(huán)境科學(xué)與工程綜合練習(xí)題水質(zhì)監(jiān)測(cè)與處理技術(shù)
- 2026年食品藥品安全法規(guī)知識(shí)測(cè)試
- 2026年軟件開發(fā)工程實(shí)踐案例功能開發(fā)測(cè)試與修復(fù)練習(xí)題
- 2025 小學(xué)二年級(jí)道德與法治上冊(cè)友好交流使用禮貌用語(yǔ)對(duì)話交流課件
- 2025年全國(guó)茉莉花茶產(chǎn)銷形勢(shì)分析報(bào)告-
- 校本課程篆刻教學(xué)設(shè)計(jì)
- 明確安全生產(chǎn)領(lǐng)導(dǎo)小組的職責(zé)與安全管理體系
- 七年級(jí)下冊(cè)語(yǔ)文必背古詩(shī)文(字帖描紅)
- 電儀施工質(zhì)量總結(jié)
- 《甜花香型大葉種工夫紅茶》編制說(shuō)明
- QSY06503.14-2020石油煉制與化工裝置工藝設(shè)計(jì)包編制規(guī)范 - 副本
- 柜式七氟丙烷-氣體滅火系統(tǒng)-安裝與施工-方案
- 核醫(yī)學(xué)全身骨顯像骨顯像課件
- 昌樂(lè)縣鎮(zhèn)區(qū)基準(zhǔn)地價(jià)更新修正體系匯編(完整版)資料
- 項(xiàng)目管理學(xué)課件戚安邦全
評(píng)論
0/150
提交評(píng)論