您的位置:首页 > 职场人生

面试题95:最小堆的调整、插入和删除

2016-09-20 10:22 288 查看
题目:

一个最小堆,也是完全二叉树,用按层遍历数组表示。

1.求结点a
的子结点的访问方式

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐