數(shù)據(jù)結(jié)構(gòu)與算法 課件 第五章樹與二叉樹_第1頁
數(shù)據(jù)結(jié)構(gòu)與算法 課件 第五章樹與二叉樹_第2頁
數(shù)據(jù)結(jié)構(gòu)與算法 課件 第五章樹與二叉樹_第3頁
數(shù)據(jù)結(jié)構(gòu)與算法 課件 第五章樹與二叉樹_第4頁
數(shù)據(jù)結(jié)構(gòu)與算法 課件 第五章樹與二叉樹_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

全國高等教育自學(xué)考試指定教材

計(jì)算機(jī)及應(yīng)用專業(yè)(本科段)數(shù)據(jù)結(jié)構(gòu)與算法第五章樹與二叉樹學(xué)習(xí)目標(biāo)理解樹及二叉樹的基本概念,掌握二叉樹的基本性質(zhì)掌握樹及二叉樹的存儲(chǔ)方式能夠?qū)崿F(xiàn)樹及二叉樹的基本操作及遍歷算法掌握堆的概念及基本操作的實(shí)現(xiàn)。理解優(yōu)先隊(duì)列的概念理解遞歸的概念,能夠?qū)崿F(xiàn)遞歸程序掌握樹、森林與二叉樹之間的相互轉(zhuǎn)換掌握哈夫曼樹及哈夫曼編碼的概念,能夠構(gòu)造哈夫曼樹并設(shè)計(jì)哈夫曼編碼本章主要內(nèi)容樹的基本概念12二叉樹的操作3二叉樹樹和森林5哈夫曼樹及哈夫曼編碼6堆及優(yōu)先隊(duì)列4第一節(jié)樹的基本概念樹是一種層次結(jié)構(gòu),是一種非線性結(jié)構(gòu)日常生活中,經(jīng)常會(huì)遇到具有層次關(guān)系的示例家族中部分成員的輩份關(guān)系樹的定義定義5-1一棵樹(tree)T是由一個(gè)或一個(gè)以上的結(jié)點(diǎn)組成的有限集,其中有一個(gè)特定的結(jié)點(diǎn)R稱為樹T的根結(jié)點(diǎn)。在集合中除根結(jié)點(diǎn)R外,其余的結(jié)點(diǎn)可劃分為k(k≥0)個(gè)不相交的子集T1,T2,…,Tk,其中每個(gè)子集都是樹,并且其相應(yīng)的根結(jié)點(diǎn)R1,R2,…,Rk是R的孩子結(jié)點(diǎn),R稱為Ri(1≤i≤k)的雙親結(jié)點(diǎn),Ri(1≤i≤k)互稱為兄弟結(jié)點(diǎn)。子集Ti(1≤i≤k)稱為根R的子樹(subtree)樹的結(jié)點(diǎn)集合至少包含一個(gè)結(jié)點(diǎn)只含有一個(gè)結(jié)點(diǎn)的樹是只有根結(jié)點(diǎn)的樹,也就是單結(jié)點(diǎn)樹對(duì)于多結(jié)點(diǎn)的樹,必須有一個(gè)結(jié)點(diǎn)是根結(jié)點(diǎn)之間通過邊來連接,邊也稱為分支。含n個(gè)結(jié)點(diǎn)的樹有且僅有n-1條邊,這是樹的重要特性之一根結(jié)點(diǎn)的各子樹之間不會(huì)有重疊樹是一種層次結(jié)構(gòu),也是遞歸形式的含有A,B,C,D,E,F,G,H,I,J共10個(gè)結(jié)點(diǎn)的樹TA為根結(jié)點(diǎn),{B,E,F},{C,G}和{D,H,I,J}構(gòu)成根結(jié)點(diǎn)A的三棵子樹,B,C,D分別是這三棵子樹的根樹中每個(gè)結(jié)點(diǎn)擁有的子樹的個(gè)數(shù)稱為結(jié)點(diǎn)的度結(jié)點(diǎn)的度即為其子結(jié)點(diǎn)的個(gè)數(shù)樹中結(jié)點(diǎn)的度的最大值稱為樹的度度為0的結(jié)點(diǎn)稱為葉結(jié)點(diǎn),或終端結(jié)點(diǎn)度不為0的結(jié)點(diǎn)稱為分支結(jié)點(diǎn)如果樹中每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)之間規(guī)定了次序,則樹稱為有序樹具有同一雙親結(jié)點(diǎn)的結(jié)點(diǎn)是兄弟結(jié)點(diǎn)從任一結(jié)點(diǎn)到根結(jié)點(diǎn)之間所經(jīng)過的所有結(jié)點(diǎn)稱為該結(jié)點(diǎn)的祖先結(jié)點(diǎn)以任一結(jié)點(diǎn)為根的子樹中的所有結(jié)點(diǎn)稱為該結(jié)點(diǎn)的后代將線性結(jié)構(gòu)中的前驅(qū)和后繼概念引申至樹中,將某結(jié)點(diǎn)的雙親結(jié)點(diǎn)看作是它的前驅(qū),它的孩子結(jié)點(diǎn)看作是它的后繼除根結(jié)點(diǎn)外,每個(gè)結(jié)點(diǎn)均只有一個(gè)前驅(qū)結(jié)點(diǎn)根的前驅(qū)結(jié)點(diǎn)個(gè)數(shù)為0,除葉結(jié)點(diǎn)外,每個(gè)結(jié)點(diǎn)都有若干個(gè)后繼結(jié)點(diǎn)葉結(jié)點(diǎn)的后繼結(jié)點(diǎn)個(gè)數(shù)為0樹中每個(gè)元素的前驅(qū)的個(gè)數(shù)不會(huì)多于1個(gè),后繼的個(gè)數(shù)可以是任意個(gè)樹是一種層次結(jié)構(gòu),設(shè)根為0層,根的孩子結(jié)點(diǎn)為1層,依此類推一般地,若某個(gè)結(jié)點(diǎn)位于i(i≥0)層,則它的孩子結(jié)點(diǎn)位于i+1層樹中結(jié)點(diǎn)的最大層數(shù)定義為樹的深度最大層數(shù)加1為樹的高度樹中從某一結(jié)點(diǎn)出發(fā),到達(dá)另一個(gè)結(jié)點(diǎn)之間所經(jīng)過的邊組成一條路徑路徑中所含的邊數(shù)為路徑長(zhǎng)度雖然樹的路徑定義中并沒有限制路徑的方向,但路徑通常是沿一個(gè)方向延伸的,即從某一結(jié)點(diǎn)向根的方向延伸,或是從某一結(jié)點(diǎn)向葉結(jié)點(diǎn)方向延伸通常,以組成路徑的結(jié)點(diǎn)序列來表示該條路徑m(m≥0)棵互不相交的樹構(gòu)成森林對(duì)樹中每個(gè)結(jié)點(diǎn)來說,其子樹的集合即為森林第二節(jié)二叉樹定義5-2二叉樹(binarytree)是結(jié)點(diǎn)的一個(gè)有限集合,這個(gè)集合或者為空,或者是由一個(gè)根結(jié)點(diǎn)以及兩棵互不相交的、分別稱為這個(gè)根的左子樹和右子樹的二叉樹組成。左子樹和右子樹的根分別稱為此二叉樹根結(jié)點(diǎn)的左孩子結(jié)點(diǎn)和右孩子結(jié)點(diǎn)二叉樹的左子樹和右子樹都可以存在或者為空,不同的存在狀態(tài)可以組合出5種基本形態(tài)一棵高度為h的二叉樹若有2h-1個(gè)結(jié)點(diǎn),則二叉樹稱為滿二叉樹從形式上來看,滿二叉樹中除葉結(jié)點(diǎn)外,每個(gè)結(jié)點(diǎn)都有兩個(gè)孩子結(jié)點(diǎn),即除最后一層外,每一層的結(jié)點(diǎn)都是“滿”的滿二叉樹中的n個(gè)結(jié)點(diǎn)進(jìn)行連續(xù)編號(hào),從編號(hào)為0的結(jié)點(diǎn)開始,由連續(xù)編號(hào)的任意多個(gè)結(jié)點(diǎn)組成的二叉樹稱為完全二叉樹特殊二叉樹滿二叉樹和完全二叉樹完全二叉樹的特性

二叉樹的性質(zhì)性質(zhì)1在二叉樹的i層上最多有2i個(gè)結(jié)點(diǎn)(i≥0)證明:使用數(shù)學(xué)歸納法證明

歸納基礎(chǔ):

對(duì)于非空的二叉樹T,根在0層,本層只有20=1個(gè)結(jié)點(diǎn),結(jié)論成立

歸納假設(shè):

設(shè)二叉樹T中i-1層最多有2i-1個(gè)結(jié)點(diǎn),考慮i層,由于i層的結(jié)點(diǎn)均為i-1層結(jié)點(diǎn)的孩子結(jié)點(diǎn),而二叉樹中每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子結(jié)點(diǎn),故i層最多有2

2i-1=2i個(gè)結(jié)點(diǎn)

根據(jù)歸納法原理,性質(zhì)1得證

性質(zhì)3對(duì)任何非空二叉樹T,設(shè)n0是葉結(jié)點(diǎn)的個(gè)數(shù),n2是度為2的結(jié)點(diǎn)的個(gè)數(shù),則有n0=n2+1證明:設(shè)二叉樹T中度為1的結(jié)點(diǎn)個(gè)數(shù)為n1,則T中結(jié)點(diǎn)總數(shù)n為 n=n0+n1+n2 n-1=2

n2+1

n1+0

n0

將上兩式聯(lián)立求解,得到 n0=n2+1

例5-3一棵二叉樹共有20個(gè)結(jié)點(diǎn),其中葉結(jié)點(diǎn)為5個(gè),則度為l的結(jié)點(diǎn)個(gè)數(shù)是()。A.11B.9C.6D.4答案為A二叉樹的存儲(chǔ)——順序存儲(chǔ)結(jié)構(gòu)對(duì)于完全二叉樹,各層自上至下,同層間自左至右,將結(jié)點(diǎn)依次存入數(shù)組從前至后的各個(gè)元素中。按照前面使用過的編號(hào)方法,一般來講,編號(hào)為i的結(jié)點(diǎn)存放在數(shù)組中下標(biāo)為i的位置使用這樣的存儲(chǔ)規(guī)則可以很方便地找到二叉樹中的相關(guān)結(jié)點(diǎn),即若知道二叉樹某一結(jié)點(diǎn)保存在數(shù)組中下標(biāo)i的位置,則可以很方便地求出它的雙親結(jié)點(diǎn)(若存在)和左、右孩子結(jié)點(diǎn)(若存在)在數(shù)組中的位置對(duì)于一般的二叉樹,順序存儲(chǔ)的思想是,針對(duì)二叉樹中的每個(gè)位置,不論這個(gè)位置有沒有結(jié)點(diǎn),都在數(shù)組中預(yù)留保存空間。采用這種存儲(chǔ)方式保存完全二叉樹時(shí),既不浪費(fèi)空間,又便于有關(guān)操作的實(shí)現(xiàn)例5-4設(shè)高度為k(k≥1)的二叉樹T采用順序存儲(chǔ)結(jié)構(gòu)保存在數(shù)組B[2k-1]中,在沒有保存T中元素的數(shù)組位置中,保存一個(gè)區(qū)別于T中元素的特殊標(biāo)記。B中保存的特殊標(biāo)記個(gè)數(shù)最多為()。A.k-1B.2k-1C.2k-k-1D.2k-1答案為C鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)定義一個(gè)結(jié)點(diǎn)結(jié)構(gòu):它含有兩個(gè)指針域,一個(gè)指針用來指向該結(jié)點(diǎn)左孩子所在的結(jié)點(diǎn),稱為左孩子指針,簡(jiǎn)稱為左指針;另一個(gè)指針用來指向該結(jié)點(diǎn)右孩子所在的結(jié)點(diǎn),稱為右孩子指針,簡(jiǎn)稱為右指針。此外,還定義一個(gè)用來保存結(jié)點(diǎn)中數(shù)據(jù)的數(shù)據(jù)域二叉鏈表表示二叉樹結(jié)點(diǎn)類的定義及二叉樹的定義二叉鏈表中結(jié)點(diǎn)類的定義及二叉樹的定義typedefintELEMType;typedefstructBNode //二叉樹結(jié)點(diǎn){ ELEMTypedata; //數(shù)據(jù)域 structBNode*left,*right;

//指向左孩子、右孩子的指針}BinTNode;typedefBinTNode*BTree; //二叉樹二叉鏈表中到底有多少空指針域呢設(shè)二叉樹中有n個(gè)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都含有兩個(gè)指針域,則二叉鏈表中共有2

n個(gè)指針域已知含n個(gè)結(jié)點(diǎn)的樹中僅含有n-1個(gè)分支,即只有n-1個(gè)指針域不為空,則其余的n+1個(gè)指針域均為空可以看出,二叉鏈表中有超過一半的指針域都是空的,這些都是結(jié)構(gòu)性開銷第三節(jié)二叉樹的操作二叉樹的生成按照二叉樹的順序存儲(chǔ)方式,將二叉樹各結(jié)點(diǎn)值保存在一維數(shù)組中,然后建立二叉鏈表如要建立如下的二叉鏈表輸入的數(shù)組是inta[]={0,1,2,3,4,NA,5,NA,NA,NA,NA,NA,NA,6};函數(shù)CreateBinaryTree遞歸處理二叉鏈表的生成調(diào)用它的主程序中先創(chuàng)建一個(gè)根結(jié)點(diǎn),其中保存數(shù)組首元素的值,該結(jié)點(diǎn)作為參數(shù)傳遞給函數(shù)CreateBinaryTree。這個(gè)結(jié)點(diǎn)的位置是下標(biāo)0,將這個(gè)位置值也作為參數(shù)傳給函數(shù)CreateBinaryTree主程序中BTreeroot;root=(BTree)malloc(sizeof(BinTNode));root->data=a[0];root->left=NULL;root->right=NULL;調(diào)用函數(shù)CreateBinaryTree。參數(shù)0是起始位置CreateBinaryTree(0,n,a,root);生成二叉鏈表如果下標(biāo)i處的結(jié)點(diǎn)有左孩子,則其應(yīng)該保存在下標(biāo)2

i+1處如果有右孩子,則應(yīng)該保存在下標(biāo)2

i+2處故在函數(shù)內(nèi),判斷數(shù)組中位置2

i+1及位置2

i+2處是否保存了元素值如果確實(shí)有值,則分配空間創(chuàng)建結(jié)點(diǎn)且保存數(shù)組中相應(yīng)位置的元素值,并讓下標(biāo)i處結(jié)點(diǎn)的相應(yīng)指針指向新創(chuàng)建的結(jié)點(diǎn)然后再以2

i+1或2

i+2為參數(shù)值,遞歸調(diào)用函數(shù),去處理2

i+1或2

i+2位置處結(jié)點(diǎn)的左孩子和右孩子如果數(shù)組中數(shù)據(jù)的存儲(chǔ)是正確的,則能正確建立二叉鏈表。如果位置2

i+1或位置2

i+2處沒有保存元素值,則遞歸結(jié)束二叉樹的遍歷對(duì)非空的二叉樹的遍歷可以相應(yīng)地分解為三項(xiàng)“子任務(wù)”訪問根結(jié)點(diǎn)遍歷左子樹(即依相應(yīng)的規(guī)律訪問左子樹中的全部結(jié)點(diǎn))遍歷右子樹(即依相應(yīng)的規(guī)律訪問右子樹中的全部結(jié)點(diǎn))常規(guī)的3種遍歷算法分別是先序遍歷、中序遍歷和后序遍歷。這3種遍歷也分別稱為先根遍歷、中根遍歷和后根遍歷先序遍歷算法若二叉樹為空,則返回;否則依次執(zhí)行以下操作(1)訪問根結(jié)點(diǎn)(2)先序遍歷左子樹(3)先序遍歷右子樹中序遍歷算法若二叉樹為空,則返回;否則依次執(zhí)行以下操作(1)中序遍歷左子樹(2)訪問根結(jié)點(diǎn)(3)中序遍歷右子樹后序遍歷算法若二叉樹為空,則返回;否則依次執(zhí)行以下操作(1)后序遍歷左子樹(2)后序遍歷右子樹(3)訪問根結(jié)點(diǎn)先序遍歷過程中序遍歷過程后序遍歷過程例5-6寫出其先序、中序及后序遍歷序列先序遍歷序列為A,B,D,G,H,J,K,E中序遍歷序列為G,D,J,H,K,B,E,A后序遍歷序列為G,J,K,H,D,E,B,A先序遍歷算法先序遍歷算法中序遍歷算法中序遍歷算法后序遍歷算法后序遍歷算法給出二叉樹的先序遍歷序列和中序遍歷序列,能唯一確定該二叉樹給出二叉樹的后序遍歷序列和中序遍歷序列,能唯一確定該二叉樹例5-7設(shè)二叉樹T的先序遍歷序列是A,B,D,G,H,J,K,E,中序遍歷序列是G,D,J,H,K,B,E,A,畫出二叉樹T由先序遍歷序列可知,T的根是A在中序遍歷序列中查找A的位置,位于A前面的是其左子樹的中序遍歷序列,位于A后面的是其右子樹的中序遍歷序列從而將原問題的求解(對(duì)整棵樹的還原)分解為兩個(gè)更小問題的求解(對(duì)兩棵子樹的還原)例5-8統(tǒng)計(jì)以二叉鏈表表示的二叉樹T中葉結(jié)點(diǎn)的個(gè)數(shù)T中葉結(jié)點(diǎn)的個(gè)數(shù)等于根左子樹中葉結(jié)點(diǎn)的個(gè)數(shù)加上根右子樹中葉結(jié)點(diǎn)的個(gè)數(shù)。所以如果遞歸調(diào)用已經(jīng)得到了兩棵子樹中葉結(jié)點(diǎn)的個(gè)數(shù),那么將結(jié)果相加即求解例5-9編寫程序,返回二叉樹T的高度仍是使用遞歸的思想去編寫程序。如果左子樹的高度和右子樹的高度都已經(jīng)知道,則二叉樹T的高度就可求得,樹的高度是兩棵子樹中較高者的高度再加1層序遍歷所謂按層遍歷,即是從根結(jié)點(diǎn)開始逐層向下遍歷,直到最后一層對(duì)于同一層的結(jié)點(diǎn),由左到右遍歷各結(jié)點(diǎn)同一層中的結(jié)點(diǎn)相繼被訪問,同時(shí),它們之間的相對(duì)次序也決定著它們孩子結(jié)點(diǎn)的相對(duì)次序。即同一層中的結(jié)點(diǎn)u和結(jié)點(diǎn)v,若先遍歷u再遍歷v,則u的孩子結(jié)點(diǎn)的遍歷也早于v的孩子結(jié)點(diǎn)的遍歷按層進(jìn)行遍歷先訪問最上面一層即0層中的元素,輸出1然后依次訪問1的子結(jié)點(diǎn)2和3再繼續(xù)訪問2的子結(jié)點(diǎn)和3的子結(jié)點(diǎn)依此類推,得到的層序遍歷結(jié)果是:1,2,3,4,5,6,7層序遍歷算法二叉樹層序遍歷的算法遍歷的非遞歸實(shí)現(xiàn)仍然將一棵二叉樹分為三部分:根、左子樹和右子樹。從根開始遍歷二叉樹時(shí),根的左子樹和右子樹的遍歷不能同時(shí)進(jìn)行,只能先遍歷一棵子樹,同時(shí)保存二叉樹中尚不能遍歷部分的信息,留待一棵子樹處理完畢后再處理分析二叉樹的遍歷過程可知,使用棧來保存相關(guān)信息先序遍歷算法在進(jìn)入左子樹進(jìn)行處理之前,需要在棧中保存右子樹的相關(guān)信息,以便當(dāng)左子樹處理完畢,能夠根據(jù)保存的線索找到右子樹的根。所以,棧中保存右子樹的根即可程序中序遍歷算法中序遍歷時(shí),先進(jìn)行左子樹的遍歷,然后遍歷根,再遍歷右子樹。所以棧中保存根的信息,遍歷完左子樹后,從棧中找到根,訪問根,同時(shí)也能容易地找到右子樹程序后序遍歷算法類似于中序遍歷過程,在進(jìn)入左子樹遍歷之前,需要先保存根的信息。當(dāng)左子樹遍歷結(jié)束,從棧中找到根,但此時(shí)因?yàn)橛易訕渖形幢闅v,所以根并不能從棧中彈出,仍需要保存在棧中,只有當(dāng)右子樹也遍歷結(jié)束后,才能訪問根棧中保存的結(jié)點(diǎn)需要入棧兩次出棧兩次。為了能有所區(qū)別,二叉樹結(jié)點(diǎn)入棧時(shí),附帶一個(gè)標(biāo)記位flag。第一次出棧時(shí),并不訪問結(jié)點(diǎn)。第二次出棧時(shí)才訪問它將二叉樹結(jié)點(diǎn)和標(biāo)記組合在一起,定義新的棧的類型,專用于非遞歸實(shí)現(xiàn)二叉樹的后序遍歷過程typedefstruct SNode //進(jìn)棧帶標(biāo)記結(jié)點(diǎn){ BinTNodebtreeNode; //二叉樹結(jié)點(diǎn)

intflag; //標(biāo)記}StackTNode; typedefstruct{ //用于后序遍歷的棧 StackTNodeelement[maxSize]; inttop; //棧頂位置}SeqBTreeStackforPostT;程序二叉樹的應(yīng)用可以使用二叉樹來表示一個(gè)表達(dá)式,這樣的二叉樹稱為表達(dá)式樹2*y*(a+3*y)-b畫出表達(dá)式樹先根據(jù)運(yùn)算符的優(yōu)先級(jí)對(duì)表達(dá)式加括號(hào)去掉最外層括號(hào)。中間的運(yùn)算符為根,前后兩部分分別對(duì)應(yīng)于左子樹和右子樹對(duì)左子樹遞歸執(zhí)行步驟②對(duì)右子樹遞歸執(zhí)行步驟②當(dāng)遇到空串時(shí),遞歸結(jié)束例5-12已知算術(shù)表達(dá)式的中綴形式為A+B*C-D/E,后綴形式為ABC*+DE/-,其前綴形式為()A.-A+B*C/DEB.-A+B*CD/EC.-+*ABC/DED.-+A*BC/DE答案:D

第四節(jié)堆及優(yōu)先隊(duì)列前一種關(guān)系表明,任何一個(gè)分支結(jié)點(diǎn)的值都不大于它子結(jié)點(diǎn)的值,所以樹根結(jié)點(diǎn)的值是全部結(jié)點(diǎn)中的最小值。這樣的堆稱為最小堆或小根堆后一種關(guān)系表明,任何一個(gè)分支結(jié)點(diǎn)的值都不小于它子結(jié)點(diǎn)的值,故樹根結(jié)點(diǎn)的值是全部結(jié)點(diǎn)中的最大值。這樣的堆稱為最大堆或大根堆樹根結(jié)點(diǎn)稱為堆頂堆的定義中還隱含了遞歸的含義,當(dāng)用完全二叉樹的形式表示堆時(shí),樹中的任意一棵子樹都可以構(gòu)成堆,并且保持與原來同樣的性質(zhì)最大堆中任何結(jié)點(diǎn)的子樹仍是最大堆最小堆中任何結(jié)點(diǎn)的子樹仍是最小堆最小堆和最大堆堆的類型定義#defineHeapSize30 //堆的容量typedefintELEMType; //元素類型typedefstructHeap{ ELEMTypeheap[HeapSize]; //存放元素的數(shù)組 intn; //堆中當(dāng)前元素個(gè)數(shù)};堆的基本操作intcreatHeap(maxHeap*H,ELEMTypearr[],intn); //創(chuàng)建堆intinsertHeap(maxHeap*H,ELEMTypex); //在堆中插入元素xintdeleteHeap(maxHeap*H,ELEMType*x); //刪除堆頂元素intisHeapEmpty(maxHeap*H); //如果堆為空,則返回1,否則返回0intisHeapFull(maxHeap*H); //如果堆為滿,則返回1,否則返回0最大堆的類型定義#defineHeapSize30 //堆的容量typedefintELEMType; //元素類型typedefstructmaxHeap{ ELEMTypeheap[HeapSize]; //存放元素的數(shù)組 intn; //堆中當(dāng)前元素個(gè)數(shù)};判空、判滿創(chuàng)建最大堆向最大堆中插入新元素刪除堆頂元素例5-1370,13,65,24,56,48,92,86,將其建成最大堆例5-14在最大堆中插入新元素40例5-15刪除最大堆的堆頂優(yōu)先隊(duì)列一些應(yīng)用中,各元素本身還被賦予一個(gè)優(yōu)先值,可以用一個(gè)非負(fù)整數(shù)表示優(yōu)先值。優(yōu)先值也稱為優(yōu)先權(quán)。具有優(yōu)先值的各元素保存在一個(gè)結(jié)構(gòu)中,這個(gè)結(jié)構(gòu)稱為優(yōu)先隊(duì)列。輸出時(shí),選擇最優(yōu)先的元素輸出?!白顑?yōu)先”取決于優(yōu)先值的定義,可以是優(yōu)先值最小,也可以是優(yōu)先值最大。第五節(jié)樹和森林樹的存儲(chǔ)結(jié)構(gòu)父結(jié)點(diǎn)表示法孩子結(jié)點(diǎn)表示法孩子-兄弟表示法父結(jié)點(diǎn)表示法樹中每個(gè)結(jié)點(diǎn)至少含兩個(gè)域,一個(gè)域用來保存結(jié)點(diǎn)本身的值,另一個(gè)域用來保存結(jié)點(diǎn)之父結(jié)點(diǎn)的相關(guān)信息孩子結(jié)點(diǎn)表示法父結(jié)點(diǎn)-孩子結(jié)點(diǎn)表示法孩子-兄弟表示法為樹中的每個(gè)結(jié)點(diǎn)定義一個(gè)存儲(chǔ)結(jié)點(diǎn),其中有左、右兩個(gè)指針域,左指針域指向這個(gè)結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn),右指針域指向這個(gè)結(jié)點(diǎn)的下一個(gè)兄弟結(jié)點(diǎn)樹、森林與二叉樹的轉(zhuǎn)換樹和二叉樹都可以用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)同一個(gè)二叉鏈表,若按樹的存儲(chǔ)含義來解釋,可以還原為樹。若按二叉樹的存儲(chǔ)含義來解釋,可以還原為二叉樹正是因?yàn)檫@一點(diǎn),可以在樹與二叉樹之間建立一種對(duì)應(yīng)關(guān)系轉(zhuǎn)換規(guī)則規(guī)則1:將森林轉(zhuǎn)換成二叉樹設(shè)F={T1,T2,…,Tm}是森林,則可按如下規(guī)則將森林F轉(zhuǎn)換為一棵二叉樹B=(root,LB,RB)(1)若F為空(m=0),則B為空樹(2)若F非空(m>0),則森林中T1的根作為二叉樹B的根root;T1中各子樹組成的森林F1={T11,T12,…,T1s}轉(zhuǎn)換成的二叉樹作為B的左子樹BL;森林F’={T2,T3,…,Tm}轉(zhuǎn)換成的二叉樹作為B的右子樹BR森林轉(zhuǎn)換為二叉樹轉(zhuǎn)換規(guī)則規(guī)則2:將二叉樹還原為森林設(shè)B=(root,BL,BR)是一棵二叉樹,則可按如下規(guī)則轉(zhuǎn)換成森林F={T1,T2,…,Tm}(1)若B為空,則F為空(2)若B非空,則B的根root作為F中第一棵樹T1的根;B的左子樹BL還原得到的森林作為T1的各子樹;B的右子樹BR還原得到的森林作為F中的T2,T3,…,Tm樹和森林的遍歷樹的兩種遍歷策略先序(根)遍歷先訪問樹的根結(jié)點(diǎn),再依次先序遍歷根結(jié)點(diǎn)的各棵子樹后序(根)遍歷若樹的根結(jié)點(diǎn)有子樹,則首先后序遍歷各棵子樹,然后再訪問根結(jié)點(diǎn);否則(根結(jié)點(diǎn)無子樹),只訪問根結(jié)點(diǎn)森林的兩種遍歷策略先序遍歷森林森林的先序遍歷過程,是按照樹的排列次序,先序遍歷各棵樹后序遍歷森林森林的后序遍歷過程,是按照樹的排列次序,后序遍歷各棵樹可以看出,森林的遍歷序列中,各棵樹中的結(jié)點(diǎn)不會(huì)混雜在一起森林與對(duì)應(yīng)的二叉樹的遍歷序列的關(guān)系二叉樹的先序遍歷序列和中序遍歷序列,與森林的先序遍歷序列和后序遍歷序列分別相同第六節(jié)哈夫曼樹及哈夫曼編碼編碼ASCII編碼、Unicode碼、電報(bào)碼定長(zhǎng)編碼算法簡(jiǎn)單,效率高在編碼長(zhǎng)度確定之后,譯文的長(zhǎng)度完成取決于原文的長(zhǎng)度變長(zhǎng)編碼變長(zhǎng)編碼前綴特性:一個(gè)編碼方案中,任何一個(gè)字符的編碼都不是該方案中任何其他字符編碼的前綴,這樣的編碼稱為具有前綴特性正是因?yàn)榫幋a方案具有前綴特性,才能夠保證譯碼過程的正確性和唯一性??梢允褂枚鏄鋪肀硎疽粋€(gè)編碼方案在二叉樹的分支上標(biāo)注0或1,從根到某結(jié)點(diǎn)的路徑上,各分支標(biāo)注的0或1組成一個(gè)編碼哈夫曼樹二叉樹中,葉結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度定義為葉結(jié)點(diǎn)的權(quán)值乘上其到根結(jié)點(diǎn)的路徑長(zhǎng)度二叉樹的帶權(quán)路徑長(zhǎng)度,就是樹中所有葉結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和二叉樹的外部帶權(quán)路徑長(zhǎng)度記為WPL其中n為葉結(jié)點(diǎn)個(gè)數(shù),wk為第k個(gè)葉結(jié)點(diǎn)的權(quán)值,lk為第k個(gè)葉結(jié)點(diǎn)的路徑長(zhǎng)度各字符出現(xiàn)的頻度分別是6、12、25、30,構(gòu)造4棵二叉樹,分別計(jì)算其WPL值4棵二叉樹的帶權(quán)路徑長(zhǎng)度WPL分別為134、195、139和146我們的任務(wù)是構(gòu)造具有最小WPL且滿足前綴特性的編碼樹設(shè)有n個(gè)權(quán)值{w1,w2,…,wn},構(gòu)造具有n個(gè)葉結(jié)點(diǎn)的二叉樹,每個(gè)葉結(jié)點(diǎn)帶有一個(gè)權(quán)值wi。在所有這樣的二叉樹中,帶權(quán)路

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論