資料結構與演算法之樹(下)

2021-10-03 02:11:51 字數 2079 閱讀 1825

這裡所講的堆不是之前的堆疊,而是一種樹。

他總是一棵完全二叉樹,其根節點總是不小於或不大於他的子孫節點。

每乙個根節點都可以視為堆頂,因為對於堆的每棵子樹都可以視為完全二叉樹。

正是因為堆擁有這樣的性質我們將他用來實現優先佇列

優先佇列意思就是每次出隊其中權重較大的元素

當然可以用陣列或鍊錶來實現,但他們的複雜度總是不盡人意(因為要排序)

堆就不同了,最大堆每次取出其根節點就是最大的了,每次插入新元素時也不用像陣列和鍊錶那樣排序。

堆一般都通過"陣列"來實現。陣列實現的堆,父節點和子節點的位置存在一定的關係。有時候,我們將"堆的第乙個元素"放在陣列索引0的位置,有時候放在1的位置。當然,它們的本質一樣(都是堆),只是實現上稍微有一丁點區別。

假設"第乙個元素"在陣列中的下標為 0 的話,則父節點和子節點的位置關係如下:

(01) 父節點為i的左孩子的下標是 (2*i+1);

(02) 父節點為i的右孩子的下標是 (2*i+2);

(03) 父節點為i的父結點的下標是 floor((i-1)/2);

floor()意思是向下取整,即取不大於要求值的最大的那個整數值;

假設"第乙個元素"在陣列中的下標為 1 的話,則父節點和子節點的位置關係如下:

(01) 父節點為i的左孩子的下標是 (2*i);

(02) 父節點為i的右孩子的下標是 (2*i+1);

(03) 父節點為i的父結點的下標是 floor(i/2);

當我們要往堆中插入新的元素時,需要遵循待插入堆的規則

如果是大根堆則要將最大的放在根節點,先將待插入元素放在堆底

將其與其根節點比較,若根節點比他小則交換,直到堆頂為止。

int

swap

(int

&x,int

&y)int a[

1000];

//堆int size;

//堆的大小

void

insert

(int n,

int a)

}

怎麼刪除?在刪除的過程中還是

要維護小根堆的性質

如果你直接刪掉了,那就沒有堆頂了,這個堆就直接亂了,所以我們要保證刪除後這一整個堆還是個完好的小根堆

首先在它的兩個兒子裡面,找乙個比較小的,和它交換一下,但是還是沒法刪除,因為下方還有節點,那就繼續交換,直到下面沒有節點了,這時候直接把它扔掉就好了

樹節點間的邊相關的數叫做權。

從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目稱作路徑長度。

如果考慮帶權的節點,節點的帶權的路徑長度就是從該節點到樹根之間的路徑長度乘該節點的權。

樹的帶權路徑長度就是所有葉子節點的帶權路徑長度之和。當該值最小時,稱這棵二叉樹為最優二叉樹或哈夫曼樹。

構造哈夫曼樹:每次在集合中選取最小的兩個元素求和,將這個和放進原來的集合,繼續此操作。

下面我們以【5、8、4、11、9、13】為例來畫出哈夫曼樹(數字大小代表權重大小,越大的權重越大)

編碼在計算機行業是非常重要的,我們要將我們編寫的程式編碼成計算機能看懂的,這樣程式才能執行。

編碼時不能出現某一字元編碼是另乙個的字首否則會導致歧義,這時我們應用哈夫曼樹的結構,將其左支權值賦為0,右支賦為1,那麼每乙個節點對應的編碼就是由根節點到該節點的路徑上的權值組成的(涉及求堆中的路徑)。路徑是唯一的,這樣就避免了編碼的二義。

資料結構與演算法之演算法

1.乙個問題的解可以分解為幾個子問題的解 2.這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 3.存在遞迴終止條件 假如這裡有 n 個台階,每次你可以跨 1 個台階或者 2 個台階,請問走這 n 個台階有多少種 走法?如果有 7 個台階,你可以 2,2,2,1 這樣子上去,也可以 1...

《資料結構與演算法》之資料結構簡介

資料結構 資料 結構,資料結構是計算機儲存 組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。一 資料的邏輯結構 指反映資料元素之間的邏輯關係的資料結構,其中的邏輯關...

資料結構自學筆記六 樹(下)

前三種遍歷演算法的 實現 由遍歷結果推導二叉樹結構 二叉樹的建立 樹 森林 二叉樹的轉換 樹與森林的遍歷 赫夫曼樹及其應用 寫在後面的廢話 不同於線性表,二叉樹的結構是非線性的,其遍歷方式也有所不同。我們先給二叉樹的遍歷乙個定義 指從根結點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪...