了解必知:
- 已知孩子节点下标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; //进入这个条件,说明父子节点的值不符合交换条件 跳出循环,出入元素向上调整结束. } } }
如果我哪里讲地不清楚,评论留言,看到就回