資料結構(第五章)

2021-10-03 01:42:27 字數 1731 閱讀 2962

樹下

第一講一.堆

什麼是堆?

在講堆之前,我們先看看什麼是優先佇列。

優先佇列:是一種特殊的佇列,從名稱上看,優先,顧名思義,取出的元素是按照一定的優先順序出隊的,而不是元素進入佇列的先後順序。

優先佇列的完全二叉樹表示

堆的兩個特性:

結構性:用陣列表示的完全二叉樹。

有序性:任一結點的關鍵字是其子樹所有結點的最大值(或最小值)。

由最大值和最小值我們可以引出乙個新概念「最大堆」「最小堆」

最大堆:每個結點的元素值不小於其子結點的元素值。

最小堆:每個結點的元素值不大於其子結點的元素值。

主要在最大堆的操作上面,因為最大堆會了,最小堆自然就不成問題了

最大堆的建立

typedef

struct heapstruct *maxheap;

struct heapstruct

maxheap create

(int maxsize)

i=++h->size;

//i指向插入堆中的最後乙個元素的位置

for(

;h->elements[i/2]

) h->elements[i]

=item;

//進行插入

}

最大堆的刪除

我們最大堆的刪除操作的演算法就是,取出根結點,也就是我們最大的元素,同時刪除堆的乙個結點

elementtype deletemax

(maxheap h)

maxitem=h->elements[1]

;//取出最大值,根結點

temp=h->elements[h->size--];

for(parent=

1;parent*

2<=h->size;parent=child)

//用最大堆的最後乙個元素從根結點開始向上過濾下層結點

if(temp>=h->elements[child]

)break

;else

h->elements[parent]

=h->elements[child];}

h->elements[parent]

=temp;

return maxitem;

}

第二講

一.赫夫曼樹的定義及原理

赫夫曼大叔說,從樹的乙個結點到另乙個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑長度,然而樹的路徑長度等於從根結點到樹的每乙個結點的路徑長度之和,帶權路徑最小的二叉樹被稱為赫夫曼樹,也稱為最優二叉樹。

赫夫曼演算法(用來查詢赫夫曼樹)描述:

根據給定的n個權值構成的n棵二叉樹的集合f=,其中每棵二叉樹ti中只有乙個帶權為wi根結點,其左右子樹均為空。在f中選取兩棵根結點的權值最小的樹作為左右子樹,然後構造乙個新的二叉樹,並且新的二叉樹的根結點的權值為其左右樹上根結點的權值之和;在f中刪除這兩棵樹,同時將新得到的二叉樹加入f中,重複上述步驟,直到f只含一棵樹為止。然後這棵樹就是赫夫曼樹。說了那麼多,其實我也不怎麼懂…

心得:通過這章結的學習,樹,和森林看似複雜,但是我們可以通過二叉樹之類的有一定規律的樹來規範它,一旦有了規律,我們順著規律走,就柳暗花明了,其次,以前喜歡用陣列,是因為其簡單易操作,但是現在發現,它太浪費空間了,而樹的結構節省了很多空間,提高了效率。

資料結構筆記 第五章

一.樹的邏輯結構 樹是乙個有限的集合,集合中的元素稱為結點。1 結點的個數為0 稱為空樹。2 結點的個數為1 此節點稱為根節點。3 節點的個數大於1 則除了根結點以外的結點又可分為多個集合,每乙個集合本身其實質上也是一棵樹,並且是根節點的子樹。二.二叉樹的邏輯結構 1 二叉樹的定義 二叉樹首先必須是...

資料結構筆記 第五章

雙親表示法 基本思想 用一維陣列來儲存樹的各個結點 一般 按層序儲存 陣列中的乙個元素對應樹中的乙個 結點,包括結點的資料資訊以及該結點的雙親在數 組中的下標 森林轉換為二叉樹 將森林中的每棵樹轉換成二叉樹 從第二棵二叉樹開始,依次把後一棵二叉樹的根 結點作為前一棵二叉樹根結點的右孩子,當所有二 叉...

資料結構筆記 第五章

樹的定義是採用遞迴方法 孩子 雙親 樹中某結點子樹的根結點稱為這個結點的孩子結點,這個結點稱為它孩子結點的雙親結點 兄弟 具有同乙個雙親的孩子結點互稱為兄弟。路徑 如果樹的結點序列n1,n2,nk有如下關係 結點ni是ni 1的雙親 1 idestroytree 前置條件 樹已存在 輸入 無 功能 ...