了解必知:
- 已知孩子节点下标i,父亲节点都是 (i-1)/2;
- 已知父亲节点下标i,左孩子就是i*2+1,有孩子就是i*2+2;
向上调整一般用在堆已经是大根堆或者小根堆的时候,当我们在一个堆的末尾插入一个数据后,需要对堆进行调整,使其仍然是一个堆,这时需要用到堆的向上调整算法.
思路就是直接看代码(小根堆插入元素为例子)
private void shiftUp(int child) { //child为插入的元素的下标
int parent=(child-1)/2; //parent为child的父亲节点
int end=child; //结束条件,判断左右孩子是否存在
child=parent*2+1; //以父节点的下标获取左孩子的下标
while(parent>=0){ //一直向上调整,直到parent<0不存在为止
if (child + 1 <= end && elem[child + 1]<elem[child]) {
//右孩子小于左孩子,child++,是的child刚好指向小的那一个
child++; //找到左右孩子的最小的一个
}
if(elem[child]<elem[parent]){ //如果孩子节点的值小于父亲节点
swap(child,parent); //交换父子节点的值,方法需要自己重写
child=parent; //交换后使孩子节点指向交换后的父亲节点的下标
parent=(child-1)/2; //父亲节点的下标由孩子的下标可推出,以此循环
}else{
break; //进入这个条件,说明父子节点的值不符合交换条件
跳出循环,出入元素向上调整结束.
}
}
}
如果我哪里讲地不清楚,评论留言,看到就回
本文详细解释了如何在已有的小根堆中,通过shiftUp函数处理新插入的元素,确保堆的性质。通过代码示例,展示了如何通过比较父节点和孩子节点的值进行交换,直至堆的结构恢复正确。
6911





