堆元素插入

二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2。 因此,第0个位置的子节点在1和2,1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。在二叉堆上可以进行插入节点、删除节点、取出值最小的节点、减小节点的值等基本操作。

 

 rt:这个地方第一次没有过,编译死活出问题,结果发现是在调用swap时没有注意,因为swap是一个外面的函数,调用时要用&来取地址更换变量。插入的话就是默认插入在数组的最后位置,(注意数组的开头是0 数组的最末端就是size-1 而新插入的元素就是size的位置) 然后仍然需要将size++ 之后就由题目知道 只要比根结点小就交换。


#include <stdio.h>
#include <stdlib.h>
#include "minbinheap.h"

bool heap_insert_value(PMinHeap pq, int value){
    if(pq->heap_size>=pq->capacity)return false;
    else pq->heap_size;
    int p=pq->heap_size++;
    pq->heap_array[p].value=value;
    while(pq->heap_array[p].value < pq->heap_array[parent(p)].value){
        swap_node(&pq->heap_array[parent(p)],&pq->heap_array[p]);
        p=parent(p);
    }
}

实现基于数组的最小插入操作时,需要考虑以下关键步骤: - 首先检查是否已满,若未满,则将新元素插入的末尾。 - 然后通过上浮(Percolate Up)操作调整,确保满足最小的性质,即父节点的值小于等于节点的值。 - 在代码中使用哨兵元素可以简化边界条件的处理,例如设置 `MinData` 为一个非常小的值作为辅助判断依据。 以下是基于上述逻辑的 C 语言实现函数,命名为 `heap_insert_value`: ```c #include <stdio.h> #include <stdlib.h> #define MinData -100 // 哨兵元素的值 typedef struct HeapStruct { int *p; int size; int capacity; } *MinHeap; // 初始化最小 MinHeap Init_MinHeap(int MaxSize) { MinHeap H = (MinHeap)malloc(sizeof(struct HeapStruct)); H->p = (int *)malloc((MaxSize + 1) * sizeof(int)); // 索引从1开始 H->capacity = MaxSize; H->size = 0; H->p[0] = MinData; // 设置哨兵 return H; } // 判断是否已满 int IsFull(MinHeap H) { return H->size == H->capacity; } // 插入元素到最小 void heap_insert_value(MinHeap H, int data) { if (IsFull(H)) { printf("已满,无法插入元素\n"); return; } int i = ++H->size; // 将新元素插入的末尾 while (H->p[i / 2] > data) { // 上浮操作 H->p[i] = H->p[i / 2]; // 父节点大于当前元素,将父节点下移 i /= 2; } H->p[i] = data; // 将新元素放到合适的位置 } ``` ### 示例用法 ```c int main() { MinHeap H = Init_MinHeap(10); heap_insert_value(H, 5); heap_insert_value(H, 3); heap_insert_value(H, 8); heap_insert_value(H, 1); for (int i = 1; i <= H->size; i++) { printf("%d ", H->p[i]); } return 0; } ``` 在示例中,依次插入元素 `5`, `3`, `8`, `1`,最终结构会自动调整以保持最小特性。输出结果应为:`1 3 8 5`,表示中的元素按照层序遍历顺序排列[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值