1.基于数组的二叉树
例如,可以用向量数组{5,1,3,9,6,2,4,7,0,8}表示下图的完全二叉树

Tips:
对于结点v[i],可利用下列公式计算其子结点和父结点
左结点:v[2*i+1]
右结点:v[2*i+2]
父结点: v[int((i-1)/2] <==> v[(i-1)/2] 因为i为整数
2.大根堆:父结点总是大于或等于它的每个子结点
小根堆:父结点总是小于或等于它的每个子结点
example:

3.大根堆的插入操作
Example:在大根堆插入50

调整大根堆

4从对中删除堆中的根节点元素
Example:
step1: 把根结点和最后一个结点交换

step2:调整

实现代码:
#include <iostream>
#include<vector>
#include<functional>
using namespace std;
template<typename T,typename compare>
/*v为向量数组
*last为向量数组的size(),
*此算法假设[0,last-2]范围是已经调整好了的大根堆
*cp为比较函数对象,例如:当greater_equal<int> ge时实现大根堆
*当less_equal<int> le时实现小根堆
*/
void insertHeap(vector<T> &v,int last,compare cp=compare())
{
int currPos=last-1; //当前结点索引
int prtPos=(currPos-1)/2; //父结点索引
T target=v[last-1]; //保存将要被调整的目标结点
例如,可以用向量数组{5,1,3,9,6,2,4,7,0,8}表示下图的完全二叉树
Tips:
对于结点v[i],可利用下列公式计算其子结点和父结点
左结点:v[2*i+1]
右结点:v[2*i+2]
父结点: v[int((i-1)/2] <==> v[(i-1)/2] 因为i为整数
2.大根堆:父结点总是大于或等于它的每个子结点
小根堆:父结点总是小于或等于它的每个子结点
example:
3.大根堆的插入操作
Example:在大根堆插入50
调整大根堆
4从对中删除堆中的根节点元素
Example:
step1: 把根结点和最后一个结点交换
step2:调整
实现代码:
#include <iostream>
#include<vector>
#include<functional>
using namespace std;
template<typename T,typename compare>
/*v为向量数组
*last为向量数组的size(),
*此算法假设[0,last-2]范围是已经调整好了的大根堆
*cp为比较函数对象,例如:当greater_equal<int> ge时实现大根堆
*当less_equal<int> le时实现小根堆
*/
void insertHeap(vector<T> &v,int last,compare cp=compare())
{
int currPos=last-1; //当前结点索引
int prtPos=(currPos-1)/2; //父结点索引
T target=v[last-1]; //保存将要被调整的目标结点