国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

二叉堆的插入操作

二叉堆是一種具有特定屬性的二叉樹,適合存儲在數(shù)組中。在二叉堆中,根節(jié)點的數(shù)值最小,每個節(jié)點的數(shù)值都要小于其子節(jié)點的數(shù)值大小。這種數(shù)據(jù)結(jié)構(gòu)可以用來實現(xiàn)一些常見的操作,如插入、刪除最小值等。下圖是一個二叉

二叉堆是一種具有特定屬性的二叉樹,適合存儲在數(shù)組中。在二叉堆中,根節(jié)點的數(shù)值最小,每個節(jié)點的數(shù)值都要小于其子節(jié)點的數(shù)值大小。這種數(shù)據(jù)結(jié)構(gòu)可以用來實現(xiàn)一些常見的操作,如插入、刪除最小值等。

下圖是一個二叉堆的示例,由于二叉堆是一個完全的二叉樹,所以可以用數(shù)組來表示。根節(jié)點存儲在arr[0],對任意節(jié)點i,其存儲位置為arr[i],父節(jié)點的位置為arr[(i-1)/2],左子節(jié)點的位置為arr[2*i 1],右子節(jié)點的位置為arr[2*i 2]。

插入操作

插入操作是將一個新的數(shù)值插入到二叉堆中的過程。首先,在二叉堆中根據(jù)完全二叉樹的特性插入一個空白位置,然后將新的數(shù)值插入到空白位置。接著,需要保證父節(jié)點始終比子節(jié)點要小,如果父節(jié)點的大小大于子節(jié)點的大小,就交換父節(jié)點和子節(jié)點的值。這個過程會持續(xù)進行,直到滿足二叉堆的排序特性。

插入一個新數(shù)值的時間復(fù)雜度為O(logN),其中N是二叉堆中元素的個數(shù)。

刪除最小值

刪除最小值操作是指刪除二叉堆的根節(jié)點。首先獲取根節(jié)點的數(shù)值,然后將二叉堆的最后一個元素放到根節(jié)點的位置,然后讓該元素層層下降到滿足二叉堆排序特性為止。

C 代碼示例

```cpp

include

using namespace std;

class MinHeap {

public:

int *arr; // 指向堆中元素的數(shù)組

int capacity; // 數(shù)組的容量

int heap_size; // 當前堆中元素的數(shù)量

public:

MinHeap(int cap);

int parent(int i) { return (i-1)/2; }

int left(int i) { return 2*i 1; }

int right(int i) { return 2*i 2; }

void insertValue(int k);

int getMin() { return arr[0]; }

void decreaseKey(int i, int new_key);

void minHeapify(int i);

int extractMin();

void deleteKey(int i);

};

// 初始化

MinHeap::MinHeap(int cap) {

capacity cap;

heap_size 0;

arr new int[cap];

}

// 插入操作

void MinHeap::insertValue(int k) {

if (heap_size capacity) {

cout << "無法插入數(shù)值" << endl;

return;

}

heap_size ;

int i heap_size - 1;

arr[i] k;

while (i ! 0 arr[parent(i)] > arr[i]) {

swap(arr[i], arr[parent(i)]);

i parent(i);

}

}

// 減小某個節(jié)點的值

void MinHeap::decreaseKey(int i, int new_key) {

arr[i] new_key;

while (i ! 0 arr[parent(i)] > arr[i]) {

swap(arr[parent(i)], arr[i]);

i parent(i);

}

}

// 維護最小堆的性質(zhì)

void MinHeap::minHeapify(int i) {

int l left(i);

int r right(i);

int smallest i;

if (l < heap_size arr[l] < arr[i])

smallest l;

if (r < heap_size arr[r] < arr[smallest])

smallest r;

if (smallest ! i) {

swap(arr[i], arr[smallest

標簽: