首先宣告此堆為小堆。小堆與大堆**相似,原理相似
小堆的插入:在已經建成的最小堆的後面插入要插入的新元素,插入之後,當節點不滿足小堆的性質時,對對重新進行向下調整。
(關於為何用新元素插入最後,就我個人而言,是為了減少調整次數,畢竟若新元素放在後面恰巧滿足堆的性質就不需要調整,總體而言,調整次數減少;若將新元素放在最前面或者任一位置,有非常大的概率破壞堆的完整性,可能需要對堆進行一次新的建立,個人觀點,不喜勿噴。)
小堆的刪除:刪除時每次刪除堆頂元素。
刪除方法:
1)判斷需要刪除的元素所在位置是否存在,若不存在,結束;若存在,位置為k,則下一步。
2)將堆的最後乙個元素代替要刪除的元素,將堆的元素個數減少乙個。
3)重新對堆進行調整,直到滿足堆的性質。
**如下:
標頭檔案:二叉堆.h
#pragma once
#include
#include
#define max 100
typedef int datatype;
//typedef int size_t;
//二叉堆
typedef struct stackn
stackn;
void init(stackn * php)
//讓資料入堆
void creats(datatype a, stackn*php, int n)
int i = 0;
for (i = 0; i < n; i++)
}void swap(int*a, int *b)
void adjust(stackn*php, int root)
int min = left; // 假設大的那個是左孩子
// 找到左右孩子中大的乙個
// 一定要先判斷右孩子有,才能比較左右孩子的大小
// if (array[right] > array[left] && right < size),錯誤的
if (right <= php->size && php->array[right] < php->array[left])
// 判斷和 [root] 的關係
// root >= max 錯誤的, root 和 max 表示的下標
if (php->array[root] <= php->array[min])
// 交換
int t = php->array[root];
php->array[root] = php->array[min];
php->array[min] = t;
root = min;}}
void a_s(stackn*php)
//堆的插入
void insert(stackn*php, datatype data)
//堆的刪除
void pop(stackn*php, datatype data)
}if (i == php->size)
php->array[i] = php->array[php->size-1];
php->size--;
a_s(php);
printf("\n");
}//列印堆
void print(stackn*php)
void test()
; //堆 調整為小堆
int n = sizeof(aa) / sizeof(datatype);
creats(aa, &php, n);
print(&php);
a_s(&php);
print(&php);
insert(&php, 110);
print(&php);
printf("加入成功\n");
pop(&php, 78);
print(&php);
printf("\n >");
pop(&php, 55);
print(&php);
}原始檔: test.cpp
堆的刪除與插入
每次刪除的一定都是堆頂的元素 具體步驟如下 將堆頂的元素與堆中的最後乙個元素交換 將堆中的有效元素減一 對堆頂的元素進項向下調整。因為第一步交換之後可能導致對不滿足大堆 小堆的性質 示例 每次刪除的是堆頂的元素 intpoll private void shiftdown int parent 檢測...
堆的建立 插入與刪除
堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為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...
堆的建立,插入,刪除
堆的概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或者最大堆 其實這麼多乾乾的概念還是很不好理解的 先來說一下什麼是完全二叉樹 如果一顆具有n個結點的二叉樹的結構與滿...