樹 堆的運用

2021-07-23 04:03:03 字數 1199 閱讀 2725

程式=演算法+資料結構。

今天所學的是「資料結構」中的「樹」。

一、樹的定義、特點、一些概念

(1)定義:任意兩個節點間有且只有一條路徑的無向圖。

(2)特點:任意兩個節點間有且只有一條路徑連線;n個節點有n-1條邊;在樹中增加一條邊會構成迴路。

(3)一些概念:根(沒有父節點的節點)、父節點、子節點、葉節點(沒有子節點的節點)、內部節點、深度(從根到節點的層數)。

二、二叉樹

(1)定義:每個節點最多有兩個子節點的樹。

(2)特殊二叉樹:滿二叉樹(每個內部節點都有兩個子節點,即有2^h-1個節點,h為深度);完全二叉樹(即最後一層從右向左

連續缺少若干個節點,其餘各層都是滿的)。

(3)應用:堆\並查集。

(4)tip:可以只用一維陣列儲存完全二叉樹(此時s型穿插,記圖)。

三、

堆是一種特殊的完全二叉樹,分為最小堆和最大堆。最小堆是所有父節點都比子節點要小的完全二叉樹,最大堆是所有父節點都比子節點要大的完全二叉樹。

1、建立堆

(1)建立最小堆

首先,建立用來存放堆的陣列,假如為h[101],堆的大小為n;

接著,讀入n個資料到陣列h[ ]中;

最後,對這n個資料進行建堆;

**如下:

#include

int h[101];

int n;

void swap(int x,int y)

void siftdown(int i)

else

flag=1;}

return; }

void creat()

int main()

(2)建立最大堆

最大堆的建立和最小堆的建立一樣,只是將siftdown( )函式相應的修改,即用t記錄值較大的節點編號。

2、堆的運用——堆排序

(1)利用最大堆排序

void heapsort()

return;}

其中,siftdown( )函式是建立最大堆的函式。經heapsort()函式後,陣列h[n]已經從小到大排好順序。

(2)利用最小堆排序

int deletemax()

此時的siftdown( )函式是建立最小堆的函式,保證了t值肯定是最小堆的堆頂,也就是陣列的最小值。

c 的STL中堆的運用

stl中的建立的隊預設是最大堆,要想用最小堆的話,必須要在push heap,pop heap,make heap等每乙個函式後面加第三個引數greater 括號不能省略 make heap first,last,comp 預設是建立最大堆的。對int型別,可以在第三個引數傳入greater 得到最...

樹 堆與Huffman樹

子女 兄弟鍊錶表示法,是一種二叉樹表示法。它的每個結點的度d 2,每個結點由3個域組成 data firstchild nextsibling 左孩子右兄弟。利用子女 兄弟鏈實現遍歷 樹的深度優先遍歷 利用遞迴進行先根次序遍歷和後根次序遍歷。樹的廣度優先遍歷 借助佇列。在訪問某一層的結點時,掃瞄它的...

可並堆 左偏樹 斜堆

經典的二叉堆已經可以在 o log n 的複雜度的情況下維護堆這樣的資料結構,也有d 堆可以維護成 o log d n 雖然pop操作的複雜度是 o d log d n 然而這兩種堆不能滿足 o log n 的合併操作,它們的經常是 o n log n 即每次將乙個堆中的堆頂拿出來放到另乙個堆裡。雖...