二叉堆的定義
二叉堆是完全二叉樹或者是近似完全二叉樹。
二叉堆滿足二個特性:
1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。
下面這段**實現了陣列實現乙個最小堆的過程,包括構造堆,堆的插入、刪除操作。具體細節會在注釋中給出解釋。
minheap.hpp
#pragma once
#include
using namespace std;
#include
template
class minheap
minheap(const t* array, size_t size)
//計算最後乙個非葉子結點,並從這個結點開始調整
int begin = _array.size() / 2 - 1;
for (; begin >= 0; begin--)
} minheap(vector& array)
//計算最後乙個非葉子結點,並從這個結點開始調整
int begin = _array.size() / 2 - 1;
for (; begin >= 0; begin--)
} void insert(const t& x)
void removeheaptop()
//將最後乙個結點的值給第乙個結點,並刪除最後乙個結點
_array[0] = _array[_array.size() -1];
_array.pop_back();
_adjustdown(0); //重新調整
}protected:
void _adjustdown(int root)
else
break;
} }void _adjustup(int child)
else
break;
} if (_array[child] < _array[root] && root == 0)
swap(_array[child], _array[root]);
}private:
vector _array;
};這裡的向上調整和向下調整函式可以實現對堆的處理。向上調整用於插入之後的排序,要注意迴圈條件和邊界值的部分。
這裡的測試用例二實現了對乙個vector類物件的構造
main.cpp
#include
using namespace std;
#include"minheap.hpp"
#include
void test1();
int size = sizeof(arr) / sizeof(arr[0]);
minheap hp1(arr,size);
hp1.insert(9);
hp1.insert(7);
hp1.removeheaptop();
hp1.removeheaptop();
hp1.removeheaptop();
}void test2();
vector arr;
for (int i = 0; i < 10; i++)
minheap hp2(arr);
hp2.insert(9);
hp2.insert(7);
hp2.removeheaptop();
hp2.removeheaptop();
hp2.removeheaptop();
}int main()
模板 二叉堆 優先佇列的二叉堆陣列實現
最近開始學資料結構,一直無心更新部落格,今天結束集訓,晚上打算碼一下最近的進度。建立乙個最大容量為maxsize的int型堆 maxheapque maxsize 預設最大容量為1007 maxheapque 作為優先佇列 pop 同優先佇列pop 如果佇列已為空還要執行pop,就會執行死迴圈以報錯...
二叉堆的實現 陣列) c
二叉堆的介紹 二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種 最大堆和最小堆。最大堆 父結點的鍵值總是大於或等於任何乙個子節點的鍵值 最小堆 父結點的鍵值總是小於或等於任何乙個子節點的鍵值。示意圖如下 二叉堆一般都通過 陣列 來實現。陣列實現的二叉堆,父節點和子節點的位置存在...
二叉堆實現二
堆可以視為一棵完全二叉樹,樹的每一層都是被填滿的,最後一層可能除外,所以堆可以用陣列來表示。對於陣列中任意位置 i上的元素,其左兒子在位置 i 2 1 其右兒子在位置 i 2 2 上,其父節點在位置 i 1 2 1處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...