最大 小 堆的建立 插入與刪除

2021-09-26 10:54:35 字數 1750 閱讀 4161

①定義

最大堆:對於任意二叉樹節點,左右孩子節點的值都小於父親節點的值。即根節點的值最大

最小堆:同理

②最大(小)堆的建立

接下來演示最小堆的建立,最大堆同理

堆的結構體如下:(由結構體可以看出,該樹是由陣列來進行儲存樹)

typedef

struct node *heap;

struct node

;

建立乙個空的堆:

heap create_empty_heap

(int n)

向最小堆中插入元素:

步驟:1.首先將size+1,並且直接將該元素直接插到最後乙個節點,即完全二叉樹

2.然後以此和父節點進行比較,若該節點比父節點小,則直接交換位置

void

insert

(heap h,

int x)

h->data[i]

= x;

}

獲取當前最小堆中最小元素,即根節點元素,data[1]

操作步驟:1.返回值就是直接返回根節點元素

2.然後將最後乙個節點元素,即data[h->size] 預設放到根節點

3.然後維護該最小堆,從根節點parent = 1,向下找兩個兒子child節點中最小的節點

4.將該根節點值與兩個兒子結點的值進行比較,如比兩個兒子節點的值都大,則完成最小堆排序

否則,將該根節點與兒子節點交換位置,在迴圈該兒子節點為根節點進行排序最小堆

int

delete_minheap

(heap h)

h->data[parent]

= x;

return ans;

}

③堆排序

堆排序的時間複雜度為nlogn ,因為遍歷n個節點,每次獲取最小值的時間複雜度為logn(原因是每次獲取最小值後,重構最小堆的時間複雜度為logn,即為樹的深度)

下面為堆排序的演示**:

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

struct node *heap;

struct node

;heap create_empty_heap

(int n)

void

insert

(heap h,

int x)

h->data[i]

= x;

}int

delete_minheap

(heap h)

h->data[parent]

= x;

return ans;

}int

main()

for(

int i =

1; i<=n; i++

)return0;

}

最小堆的建立 插入 與刪除

堆是完全二叉樹,完全二叉樹最大的特點就是 把資料儲存在陣列裡 通過父子結點的關係來做 不用實際建樹 parent leftchild 2 leftchild 2 parent 右就加1這兒指的是序號關係,儲存的時候注意是利用樹的邏輯圖 從上到下 從左到右編號12345.建堆 實際是把資料先放入陣列 ...

堆的建立 插入與刪除

堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為i的節點時 如果i 0,節點i是根節點 否則節點i的父節點為節點 i 1 2 如果2i 1 n 1,則節點i無左子女 否則節點i的左子女為2i 1 如果2i 2 n 1,則節點i無右子女 否則節點i的右子女為2i 2 typede...

資料結構 大小堆的理解,建立,增加和刪除元素操作

大小堆是基於完全二叉樹的結構 大堆 任意乙個結點的左右孩子的資料都小於此結點的資料,位於堆頂的結點的資料最大。小堆 任意乙個結點的左右孩子的資料都大於此結點的資料,位於堆頂的結點的資料最小。下面以小堆為例,以下都是以小堆為例 首先我們只會得到乙個陣列,並且我們知道堆最終形態是完全二叉樹。通過遞迴的思...