最小堆的插入(C语言实现)

最小堆,是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于其左子节点和右子节点的值。
通俗的说就是:
1.数组来实现二叉树,所以满足二叉树的特性。
2.根元素是最小的元素,父节点小于它的两个子节点。
3.树中的元素是相对有序的。

如何实现堆的相对有序是关键。

插入元素时,插入到数组中的最后一个元素的后面,然后与该节点的父节点比较大小。如果插入的元素小于父节点元素,那么与父节点交换位置。然后插入元素交换到父节点位置时,又与该节点的父节点比较,直到大于父节点元素或者到达堆顶。该过程叫做上浮,即插入时上浮。

移除元素时,只能从堆顶移除元素,再取最后一个元素放到堆顶中。然后堆顶节点与子节点比较时,先取子节点中的较小者,如果堆顶节点大于较小子节点,那么交换位置。此时堆顶节点元素交换到较小子节点上。然后再与其较小子节点比较,直到小于较小子节点或者到达叶子节点为止。该过程叫做下沉,即移除元素时下沉。

附上一个简单的最小堆插入代码:

#include <stdio.h>
#define MAXN 1005
#define MINDATA -10005
int Data[MAXN], size;
void Insert(int x) {
    int i = ++size;
    for( ; x < Data[i/2]; i /= 2)
        Data[i] = Data[i/2];
    Data[i] = x;
}
int main() {
    int N, M;
    int x;
    scanf("%d%d", &N, &M);
    Data[0] = MINDATA;
    size = 0;
    while(N--) {
        scanf("%d", &x);
        Insert(x);
    }
    while(M--) {
        scanf("%d", &x);
        printf("%d", Data[x]);//指定节点到根节点的路径遍历
        x /= 2;
        while(x) {
            printf(" %d", Data[x]);
            x /= 2;
        }
        printf("\n");
    }
    return 0;
}

发布了105 篇原创文章 · 获赞 117 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章