7 2 其餘的一些樹 排序二叉樹 霍夫曼樹

2021-09-24 16:56:28 字數 3221 閱讀 9566

二叉排序樹可以通過遞迴的方法來定義,它或者是空二叉樹,或者是具有如下定義的二叉樹:

左子樹上所有節點的關鍵字均小於根節點的關鍵字右子樹上所有節點的關鍵字均大於等於根節點的關鍵字

左子樹和右子樹本身又各是一顆二叉排序樹

二叉排序樹的生成

從二叉排序樹的定義中可以得出乙個重要性質:

按中序遍歷該樹所得的中序序列是乙個遞增有序列!因此二叉排序樹常用來對資料進行排序操作。利用二叉排序樹來組織資料,可以減少資料查詢次數,提高效率。

由給定的資料序列生成二叉排序樹的過程是在二叉排序樹上插入節點的過程,對乙個序列{k1, k2, k3 ,..., kn},先設一顆空二叉排序樹,然後將序列中的元素順次生成節點後逐個插入。

第一步:k1作為二叉排序樹的根;

第二步:若k2 < k1, 則k2 所在節點應插入到k1的左子樹上;否則,插入到k1的右子樹上。

第三步:讀入 ki,如果 ki=kj 且 kj的右子樹為空,則ki插入到kj的右子樹上。

前面講的都是二叉樹的一些東西,二叉樹比較特殊,所以有很多性質,對於普通結構的樹,儲存方法大致上有3種:

①雙親表示法;

②孩子表示法;

③孩子兄弟表示法;

雙親表示法採用順序表(也就是陣列)儲存普通樹,其實現的核心思想是:順序儲存各個節點的同時,給各節點附加乙個記錄其父節點位置的變數。根節點沒有父節點(父節點又稱為雙親節點),因此根節點記錄父節點位置的變數通常置為 -1

孩子表示法儲存普通樹採用的是 "順序表+鍊錶" 的組合結構,其儲存過程是:從樹的根節點開始,使用順序表依次儲存樹中各個節點,需要注意的是,與雙親表示法不同,孩子表示法會給各個節點配備乙個鍊錶,用於儲存各節點的孩子節點位於順序表中的位置。

如果節點沒有孩子節點(葉子節點),則該節點的鍊錶為空鍊錶

樹結構中,位於同一層的節點之間互為兄弟節點。孩子兄弟表示法,採用的是鏈式儲存結構,其儲存樹的實現思想是:從樹的根節點開始,依次用鍊錶儲存各個節點的孩子節點和兄弟節點。

該鍊錶中的節點應包含以下 3 部分內容(如圖):

a,節點的值;

b, 指向孩子節點的指標;

c, 指向兄弟節點的指標;

觀察上面左右兩圖發現,左圖是一顆普通樹,但是右圖很明顯是一顆二叉樹!

所以這也就給我們提供了將普通樹轉換為二叉樹的思路

a,在兄弟的之間連線;

b,對每個節點,只保留它與第乙個子節點的連線,與其他子節點的連線抹去;

c,將原來的兄弟節點順時針移動45°

先將森林中的各個普通樹用①中的方法,都轉化為二叉樹,然後將各個二叉樹的根節點連在一起,自然就是一棵二叉樹了。因為①的方法轉換出來的二叉樹,根節點沒有右子樹,所以將多棵這樣的二叉樹連起來,右邊的二叉樹就成了第一棵二叉樹根節點的右子樹部分。

霍夫曼編碼是一種有效的資料壓縮技術,能夠使得編碼量減少。

先來看乙個霍夫曼編碼的例子:

已知乙個通訊系統中使用的字元為a, b, c, d, e, f, g 7個不同的字母,每傳輸1千字,他們出現的頻率為: 115,11,14,35,516,254,55.

①把7個不同的字母看成不同的節點,它們的出現頻率就看成它們的權重,先按照權重對它們排序如下:

②選出其中權重最小的兩個節點,分別作為左右節點,構成一棵樹,一般遵循左小右大。

它們的父節點的權重設為此二節點之和:

③不斷重複以上過程,直到所有的節點都被使用:

如果把每條左邊的邊標為0,右邊的邊標為1,那麼就得到這7個字母的霍夫曼編碼:

e---1, f---01, a---001, g---0000, d---00011, b---000100, c---000101,

試想,如果使用傳統的二進位制編碼從 000到110 共7個二進位制編碼對這7個數進行編碼,則每個字元都需要3bit,那麼1000字的內容就是3000 bit;

而如果採用霍夫曼編碼,同樣1000字,只需要:

1x516 + 2x254 + 3x115 + 4x55 + 5x35 + 6x11 + 6x14 = 1914 bit

資料壓縮比為: (3000-1914)/3000 = 36.2%

霍夫曼編碼得到的二叉樹給出了一種能保證資訊通訊時最少的編碼量,也引入了最優二叉樹的概念,最優二叉樹也稱為 霍夫曼樹。

最優二叉樹(霍夫曼樹)

葉子節點的權值:葉子節點的權值是對葉子節點賦予的乙個有意義的數量值。霍夫曼編碼中,就是某個字母出現的頻次;

節點的帶權路徑長度:從該節點到樹根之間的路徑長度與該節點權的乘積;

樹的帶權路徑長度 wpl:樹中所有葉子節點的帶權路徑長度 之和

最優二叉樹:指所有葉子節點的二叉樹中帶權路徑最小的二叉樹。

在構建哈弗曼樹時,要使樹的帶權路徑長度最小,只需要遵循乙個原則,那就是:權重越大的結點離樹根越近。

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...

樹和二叉樹的一些知識

樹,包含n個結點 n 0 而且滿足以下條件的有限集合。存在唯一的結點,無前驅結點,即根 任何非根結點都有且只有乙個前驅結點,即父節點 任何結點都有可能有多個後繼結點,即子節點,沒有後繼結點的稱為葉節點 任何非根節點都有且只有一條從根節點到該節點的結點序列。度 次數 該節點的子節點個數 度為0的結點為...

二叉樹的一些概念

1 滿二叉樹 樹內的任何結點,或為樹葉 圖1中2689 或有兩個非空子樹。滿二叉樹定理 非空滿二叉樹樹葉的數目等於其分支結點數目加1。此外,乙個二叉樹第i層 根節點為0層 最多能有2的i次方個結點。圖12 平衡二叉樹 如果樹中任何結點的兩個子樹高度差是0或者1。對於圖1來說結點1左子樹高度為1,右子...