陣列實現二叉堆

2022-09-23 13:12:09 字數 1868 閱讀 9233

二叉堆的定義

二叉堆是完全二叉樹或者是近似完全二叉樹。

二叉堆滿足二個特性:

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處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...