小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
谈一谈最小二叉堆的几种操作
0x00 前言
今天我们来谈一谈最小二叉堆的三种操作——插入、删除、更新。先来介绍一下什么是最小二叉堆,最小二叉堆也是一棵二叉树,最小二叉堆就是父节点一定比子节点小,也就是所有的父节点都比它的左右子节点要小。
关于怎么建堆,我这里就不细说了,因为是一颗完全二叉树,所以我们可以用数组来存储最小二叉堆。我们这里使用堆{6,2,3,4,5,6,7}。我们将最小二叉堆所在数组的第一个值设置为堆内元素的个数,这样能给后续操作带来便利。
0x01 插入操作
void insert( int x, int heap[]) {
heap[heap[0]+1] = x;
heap[0]++;
int i = heap[0];
while(i>1 && heap[i] < heap[i/2]) {
swap(&heap[i],&heap[i/2]);
i /= 2;
}
}
前面我们说了,二叉堆所在数组也就是heap[0],代表的是堆内元素个数。我们先将要插入的元素放置到堆的后一个位置,也就是heap[0]+1,然后将heap[0]也就是堆内元素个数自增。
然后设置循环,只要父节点大于子节点的值并且索引不等于0,就将父节点与子节点交换位置,并且将循环的索引放置到之前节点的父节点(也就是选择的节点索引)。
以上就是我们的最小二叉堆的插入操作全部内容,关于删除和更新操作,我们后续会继续介绍~