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

本文介绍了一个完全二叉树表示的最小堆,并详细解释了如何通过数组实现该二叉树。主要内容包括:确定子节点的位置、插入新元素到堆中并保持堆属性的方法、以及删除堆顶元素后的堆结构调整过程。

题目:

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值