最小堆的调整、插入和删除
2012-05-15 20:42
190 查看
今天看到一道面试题,
一个最小堆,也是完全二叉树,用按层遍历数组表示。
1. 求节点a
的子节点的访问方式
2. 插入一节点的程序void add_element(int *a,int size,int val);
3. 删除最小节点的程序。
刚看到的时候觉得挺难的,没有什么思路,原因在于对最小堆的完全二叉树不了解,其实这个二叉树和堆排序时建立的二叉树是一样的。
1、按照数组下标,下标为n的节点,它的子结点下标为2*n+1和2*n+2;
2、插入节点时,先插入到最后,然后再调整堆。
3、删除最小节点即删除根节点,先将根节点和最后一个节点交换,再调整堆。
本文出自 “菜鸟变身记” 博客,请务必保留此出处http://buptdtt.blog.51cto.com/2369962/864190
一个最小堆,也是完全二叉树,用按层遍历数组表示。
1. 求节点a
的子节点的访问方式
2. 插入一节点的程序void add_element(int *a,int size,int val);
3. 删除最小节点的程序。
刚看到的时候觉得挺难的,没有什么思路,原因在于对最小堆的完全二叉树不了解,其实这个二叉树和堆排序时建立的二叉树是一样的。
1、按照数组下标,下标为n的节点,它的子结点下标为2*n+1和2*n+2;
2、插入节点时,先插入到最后,然后再调整堆。
3、删除最小节点即删除根节点,先将根节点和最后一个节点交换,再调整堆。
#include "stdafx.h" #include<iostream> using namespace std; //往最小堆中插入元素,先插在数组的最后,然后类似于插入排序找到合适位置。 void MinHeapAdd(int *a,int n,int number) { a =number; int i=n; int j=(i-1)/2; int tmp=a[i]; while(j>=0) { if(a[j]<=tmp) break; else { a[i]=a[j]; i=j; j=(i-1)/2; } } a[i]=tmp; } //从第m个开始调整,n为结点总数 类似于插入排序 void MinHeapFixDown(int *a,int m,int n) { int i=m; int j=2*i+1; int tmp=a[i]; while(j<n) { if(j+1<n&&a[j]>a[j+1]) j++; if(a[j]>=tmp) break; else { a[i]=a[j]; i=j; j=2*i+1; } } a[i]=tmp; } //删除最小节点 void MinHeapDelete(int *a,int n) { a[0]=a[n-1]; MinHeapFixDown(a,0,n-1); } //初始建堆 void MakeMinHeap(int *a,int n) { for(int i=n/2-1;i>=0;i--)//注意 MinHeapFixDown(a,i,n); } //堆排序 void HeapSort(int *a,int n) { MakeMinHeap(a,n); for(int i=n-1;i>=1;i--) { int tmp=a[0];a[0]=a[i];a[i]=tmp; MinHeapFixDown(a,0,i); } } void main() { int a[10]={36,30,18,40,32,45,22,50}; HeapSort(a,8); for(int i=0;i<8;i++) cout<<a[i]<<" "; cout<<endl; int aa[10]={36,30,18,40,32,45,22,50}; MakeMinHeap(aa,8); for(int i=0;i<8;i++) cout<<aa[i]<<" "; cout<<endl; MinHeapAdd(aa,8,35); for(int i=0;i<9;i++) cout<<aa[i]<<" "; cout<<endl; MinHeapDelete(aa,9); for(int i=0;i<8;i++) cout<<aa[i]<<" "; cout<<endl; }
本文出自 “菜鸟变身记” 博客,请务必保留此出处http://buptdtt.blog.51cto.com/2369962/864190
相关文章推荐
- 面试题95:最小堆的调整、插入和删除
- 最小堆的调整、插入和删除
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
- 最大堆的插入/删除/调整/排序操作
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 最大堆,最小堆插入/删除以及最大堆的排序
- 二叉堆 删除 插入 调整 堆排序
- 最小堆 构建、插入、删除的过程图解
- 堆排序,插入,删除,调整算法(大顶堆)
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 堆的定义、使用数组实现堆的创建、调整、删除和插入、堆排序
- 堆排序,插入,删除,调整算法(大顶堆)
- 堆排序,插入,删除,调整算法(大顶堆)
- 最小堆的插入、删除和创建的C语言实现
- 堆的动态操作(插入、删除、调整)
- 最大最小堆的插入与删除
- Java实现堆的封装,进行插入,调整,删除堆顶以完成堆排序实例