資料結構 堆 二叉樹學習前必看

2021-09-28 20:37:15 字數 3753 閱讀 7118

長路漫漫, 唯劍作伴.

要學習二叉樹, 先來看看二叉樹的分類, 二叉樹的分類可根據儲存方式來:

從儲存方式來看, 二叉樹更加適合鏈式結構, 能更加節省空間, 避免空間浪費.

但順序結構也適合一些特殊的二叉樹 .如:完全二叉樹.

由完全二叉樹衍生出來的堆, 也是乙個十分重要的資料結構

注意: 這裡的堆與計算機記憶體的堆完全是兩碼事.這裡指的是儲存結構.

在學習堆之前, 應該知曉完全二叉樹的一些基本知識:

堆的操作相對順序表比較複雜, 先來看堆的結構實現

typedef

struct heap

heap;

建堆o(n) +排序o(nlogn) = o(nlogn)堆排序的時間複雜度,主要在初始化堆過程和每次選取最大數後重新建堆的過程;

推算過程:

首先要理解怎麼計算這個堆化過程所消耗的時間,可以直接畫圖去理解;

假設高度為k,則從倒數第二層右邊的節點開始,這一層的節點都要執行子節點比較然後交換(如果順序是對的就不用交換);倒數第三層呢,則會選擇其子節點進行比較和交換,如果沒交換就可以不用再執行下去了。如果交換了,那麼又要選擇一支子樹進行比較和交換;

那麼總的時間計算為:s = 2^( i - 1 ) * ( k - i );其中 i 表示第幾層,2^( i - 1) 表示該層上有多少個元素,( k - i) 表示子樹上 k = log(n) + 1,帶入 s = 2^k -k -1,得到:s = 2n - logn -2

所以時間複雜度為:o(n)

推算過程:

綜上所述:堆排序的時間複雜度為:o(nlogn)

void

heapinit

(heap* hp, hpdatatype* array,

int size)

;void

heapinsert

(heap* hp, hpdatatype data)

;void

heaperase

(heap* hp)

;int

heapsize

(heap* hp)

;int

heapempty

(heap* hp)

;hpdatatype heaptop

(heap* hp)

;void

heapdestroy

(heap* hp)

;void

heapsort

(int

* array,

int size)

;

難點:

void

swap

(hpdatatype* child, hpdatatype* parent)

// parent為要調整的節點

void

adjustdown

(hpdatatype* array,

int size,

int parent)

if(array[child]

< array[parent]

)else}}

// 所有元素按完全二叉樹的順序儲存方式儲存 在乙個一維陣列中

void

heapinit

(heap* hp, hpdatatype* array,

int size)

hp->_capacity = size;

for(

int i =

0; i < size;

++i)

hp->_size = size;

// 堆的特性: 堆中某個節點的值總是不大於或不小於其父節點的值還不滿足

// 進行調整

// 向下調整---建立堆的關鍵一步

// 向下調整演算法有乙個前提:左右子樹必須是乙個堆,才能調整

// 找完全二叉樹中倒數第乙個非葉子節點, 從此向上把每乙個節點下的都調整成堆

// 一直到跟節點

int root =

(size -2)

>>1;

// 最後乙個節點下標為size - 1; 其雙親節點為 (k - 1) /2

for(

; root >=0;

--root)

}void

adjustup

(hpdatatype* array,

int size,

int child)

else}}

void

cheakcapacity

(heap* hp)

hp->_capacity = newcapacity;

for(

int i =

0; i < hp->_size;

++i)

free

(hp->_array)

; hp->_array = ptemp;}}

void

heapinsert

(heap* hp, hpdatatype data)

// 應該刪除堆頂的, 因為堆頂不是最大的就是最小的

// 堆頂與最後乙個交換, size--, 再來一次向下調整演算法

void

heaperase

(heap* hp)

swap

(&hp->_array[0]

,&hp->_array[hp->_size -1]

);hp->_size -=1

;adjustdown

(hp->_array, hp->_size,0)

;}intheapsize

(heap* hp)

intheapempty

(heap* hp)

hpdatatype heaptop

(heap* hp)

void

heapdestroy

(heap* hp)

}void

heapadjust

(int

* array,

int size,

int parent)

if(array[child]

> array[parent]

)else}}

void

heapsort

(int

* array,

int size)

// 2. 排序, 用堆刪除的思想

資料結構1 從二叉樹到二叉堆

資料結構是計算機儲存 組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。不過,作為一些剛剛接觸資料結構的人來說,我們並不需要了解這麼多 恰恰相反,我們從簡單的開始。這...

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...