程式=演算法+資料結構。
今天所學的是「資料結構」中的「樹」。
一、樹的定義、特點、一些概念
(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 即每次將乙個堆中的堆頂拿出來放到另乙個堆裡。雖...