2016 - 2024

感恩一路有你

二叉堆的插入操作

浏览量:1754 时间:2024-07-01 09:02:40 作者:采采

二叉堆是一种具有特定属性的二叉树,适合存储在数组中。在二叉堆中,根节点的数值最小,每个节点的数值都要小于其子节点的数值大小。这种数据结构可以用来实现一些常见的操作,如插入、删除最小值等。

下图是一个二叉堆的示例,由于二叉堆是一个完全的二叉树,所以可以用数组来表示。根节点存储在arr[0],对任意节点i,其存储位置为arr[i],父节点的位置为arr[(i-1)/2],左子节点的位置为arr[2*i 1],右子节点的位置为arr[2*i 2]。

插入操作

插入操作是将一个新的数值插入到二叉堆中的过程。首先,在二叉堆中根据完全二叉树的特性插入一个空白位置,然后将新的数值插入到空白位置。接着,需要保证父节点始终比子节点要小,如果父节点的大小大于子节点的大小,就交换父节点和子节点的值。这个过程会持续进行,直到满足二叉堆的排序特性。

插入一个新数值的时间复杂度为O(logN),其中N是二叉堆中元素的个数。

删除最小值

删除最小值操作是指删除二叉堆的根节点。首先获取根节点的数值,然后将二叉堆的最后一个元素放到根节点的位置,然后让该元素层层下降到满足二叉堆排序特性为止。

C 代码示例

```cpp

include

using namespace std;

class MinHeap {

public:

int *arr; // 指向堆中元素的数组

int capacity; // 数组的容量

int heap_size; // 当前堆中元素的数量

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 << "无法插入数值" << 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);

}

}

// 减小某个节点的值

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);

}

}

// 维护最小堆的性质

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

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。