题目:
一个最小堆,也是完全二叉树,用按层遍历数组表示。
1.求结点a[n]的子结点的访问方式
2.插入一结点的程序void add_element(int *a,int size, int val);
3.删除最小结点的程序。
思路:
1.下标为n的结点,其子节点的下标为2*n+1和2*n+2
2.插入一个结点时,先插入到最后,然后再从下向上调整堆。
3.删除最小结点即删除根结点,先将根结点和最后一个结点交换,再调整堆。
#include <iostream>
using namespace std;
int Left(int index){ return index * 2 + 1; }
int Right(int index){ return index * 2 + 2; }
void Output(int *num, int size){
for (int i = 0; i < size; i++)
cout << num[i] << " ";
cout << endl;
}
void MinHeapity(int *num, int rootIndex, int heapSize){
int minIndex = 0;
int left = Left(rootIndex);
int right = Right(rootIndex);
//下面if-else-if是为了找出根结点、左孩子、有孩子最小值对应的下标
if (left < heapSize && num[left] < num[rootIndex])
minIndex = left;
else
minIndex = rootIndex;
if (right < heapSize && num[right] < num[minIndex])
minIndex = right;
if (rootIndex != minIndex){
swap(num[rootIndex], num[minIndex]);
MinHeapity(num, minIndex, heapSize);
}
}
void AddElement(int *num, int size, int val){
num[size] = val;
size++;
for (int i = size / 2; i >= 0; i--)
MinHeapity(num, i, size);
Output(num, size);
}
void DeleteMin(int *num, int size){
num[0] = num[size - 1];
size--;
MinHeapity(num, 0, size);
Output(num, size);
}
int main(int argc, char* argv[])
{
int num[20] = { 1, 2, 5, 7, 8, 9, 10 };
AddElement(num, 7, 6);
DeleteMin(num, 8);
return 0;
}
本文介绍了一个完全二叉树表示的最小堆,并详细解释了如何通过数组实现该二叉树。主要内容包括:确定子节点的位置、插入新元素到堆中并保持堆属性的方法、以及删除堆顶元素后的堆结构调整过程。
46万+

被折叠的 条评论
为什么被折叠?



