面试题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.删除最小结点即删除根结点,先将根结点和最后一个结点交换,再调整堆。
一个最小堆,也是完全二叉树,用按层遍历数组表示。
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; }
相关文章推荐
- 最小堆的调整、插入和删除
- 最小堆的调整、插入和删除
- 面试题9:数组堆化、堆的插入、堆的删除、堆排序
- 堆排序,插入,删除,调整算法(大顶堆)
- 最小堆 构建、插入、删除的过程图解
- 【单链表面试题】------链表的打印,删除,插入
- 最大堆,最小堆插入/删除以及最大堆的排序
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
- 设计链表进行插入、删除(面试题)
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 最大堆的插入/删除/调整/排序操作
- 堆的定义、使用数组实现堆的创建、调整、删除和插入、堆排序
- 面试题7:用两个栈实现队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead, 分别完成在队列尾部插入结点和在队列头部删除节点的功能。
- 面试题23:二叉搜索树的查找、插入、删除
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点