科大C語言筆記-2

哈夫曼樹的基本概念

最優二叉樹,也稱哈夫曼(Haffman)樹,是指對於一組帶有肯定權值的葉結點,構造的具備最小帶權路徑長度的二叉樹數組

 

給出4 個葉結點,設其權值分別爲1,3,5,7,咱們能夠構造出形狀不一樣的多個二叉樹。這些形狀不一樣的二叉樹的帶權路徑長度將各不相同。spa

這五棵樹的帶權路徑長度分別爲:
(a)WPL=1×2+3×2+5×2+7×2=32
(b)WPL=1×3+3×3+5×2+7×1=29  //根節點開始,從0到葉節點經歷了幾就乘幾,再求和
(c)WPL=1×2+3×3+5×3+7×1=33
(d)WPL=7×3+5×3+3×2+1×1=43 
(e)WPL=7×1+5×2+3×3+1×3=29指針

 

 

下圖:給出了前面提到的葉結點權值集合爲W={1,3,5,7}的哈夫曼樹的構造過程。能夠計算出其帶權路徑長度爲29,因而可知,對於同一組給定葉結點所構造的哈夫曼樹,樹的形狀可能不一樣,但帶權路徑長度值是相同的,必定是最小的。it

二叉樹的相關概念

(1)結點的。結點所擁有的子樹的個數稱爲該結點的度
(2)葉結點。度爲0 的結點稱爲葉結點,或者稱爲終端結點。
(3)分枝結點。度不爲0 的結點稱爲分支結點,或者稱爲非終端結點。一棵樹的結點除葉結點外,其他的都是分支結點。
(4)左孩子、右孩子、雙親。樹中一個結點的子樹的根結點稱爲這個結點的孩子。這個結點稱爲它孩子結點的雙親。具備同一個雙親的孩子結點互稱爲兄弟。
(5)路徑、路徑長度。若是一棵樹的一串結點n1,n2,…,nk 有以下關係:結點ni 是ni+1的父結點(1≤i<k),就把n1,n2,…,nk 稱爲一條由n1 至nk 的路徑。這條路徑的長度是k-1。
(6)祖先、子孫。在樹中,若是有一條路徑從結點M 到結點N,那麼M 就稱爲N的祖先,而N 稱爲M 的子孫。
(7)結點的層數。規定樹的根結點的層數爲1,其他結點的層數等於它的雙親結點的層數加1。
(8)樹的深度。樹中全部結點的最大層數稱爲樹的深度。
(9)樹的度。樹中各結點度的最大值稱爲該樹的度。
(10)滿二叉樹:在一棵二叉樹中,若是全部分支結點都存在左子樹和右子樹而且全部葉子結點都在同一層上,這樣的一棵二叉樹稱做滿二叉樹。class

(a)圖就是一棵滿二叉樹,(b)圖則不是滿二叉樹,由於,雖然其全部結點要麼是含有左右子樹的分支結點,要麼是葉子結點,但因爲其葉子未在同一層上,故不是滿二叉樹。二叉樹

徹底二叉樹。

一棵深度爲k 的有n 個結點的二叉樹,對樹中的結點按從上至下、從左到右的順序進行編號,若是編號爲i(1≤i≤n)的結點與滿二叉樹中編號爲i 的結點在二叉樹中的位置相同,則這棵二叉樹稱爲徹底二叉樹。徹底二叉樹的特色是:葉子結點只能出如今最下層和次下層,且最下層的葉子結點集中在樹的左部。顯然,一棵滿二叉樹一定是一棵徹底二叉樹,而徹底二叉樹未必是滿二叉樹。如圖6.3 所示(a)爲一棵徹底二叉樹,(b)和圖6.2(b)都不是徹底二叉樹。終端

基本操做與存儲—二叉樹的存儲

1.順序存儲結構

所謂二叉樹的順序存儲,就是用一組連續的存儲單元存放二叉樹中的結點。通常是按照二叉樹結點從上至下、從左到右的順序存儲。這樣結點在存儲位置上的前驅後繼關係並不必定就是它們在邏輯上的鄰接關係,然而只有經過一些方法肯定某結點在邏輯上的前驅結點和後繼結點,這種存儲纔有意義。所以,依據二叉樹的性質,徹底二叉樹和滿二叉樹採用順序存儲比較合適,樹中結點的序號能夠惟一地反映出結點之間的邏輯關係,這樣既可以最大可能地節省存儲空間,又能夠利用數組元素的下標值肯定結點在二叉樹中的位置,以及結點之間的關係。

對於通常的二叉樹,若是仍按從上至下和從左到右的順序將樹中的結點順序存儲在一維數組中,則數組元素下標之間的關係不可以反映二叉樹中結點之間的邏輯關係,只有增添一些並不存在的空結點,使之成爲一棵徹底二叉樹的形式,而後再用一維數組順序存儲。
方法

 

 

2.鏈式存儲結構


所謂二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示着元素的邏輯關係。一般有下面兩種形式。im

(1)二叉鏈表存儲

鏈表中每一個結點由三個域組成,除了數據域外,還有兩個指針域,分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址。結點的存儲的結構爲:鏈表

其中,data 域存放某結點的數據信息;lchild 與rchild 分別存放指向左孩子和右孩子的指針,當左孩子或右孩子不存在時,相應指針域值爲空(用符號∧或NULL 表示)。

相關文章
相關標籤/搜索