【PTA数据结构 | C语言版】多叉堆的上下调整

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

请编写程序,将 n 个已经满足 d 叉最小堆顺序约束的数据直接读入最小堆;随后将下一个读入的数据 x 插入堆;再执行删顶操作并输出删顶的元素;最后顺次输出堆中剩余元素以检验操作的正确性。

输入格式:

输入在第 1 行给出 2 个正整数 c(2<c≤1000)和 d(1<d≤4),依次对应最小堆的最大容量和树的度;下一行给出正整数 n(<c);随后一行按层序遍历的顺序给出 n 个最小堆元素;最后一行给出将要插入堆的元素 x。所有堆元素均为 int 型范围内的整数。

输出格式:

在一行中输出插入后再删顶的元素,格式为 min = y,其中 y 为删顶元素值。

随后 n 行,按层序遍历的顺序每行输出一个最小堆元素。

输入样例:

10 3

9

1 3 4 6 7 10 8 5 9

2

输出样例:

min = 1

2

3

4

6

7

10

8

5

9

代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 向上调整,维护d叉最小堆性质
void siftUp(int arr[], int n, int d, int i) {
    while (i > 0) {
        int parent = (i - 1) / d;
        if (arr[i] >= arr[parent]) break;
        swap(&arr[i], &arr[parent]);
        i = parent;
    }
}

// 向下调整,维护d叉最小堆性质
void siftDown(int arr[], int n, int d, int i) {
    while (1) {
        int smallest = i;
        int startChild = d * i + 1;
        int endChild = startChild + d;

        for (int j = startChild; j < endChild && j < n; j++) {
            if (arr[j] < arr[smallest]) {
                smallest = j;
            }
        }

        if (smallest == i) break;

        swap(&arr[i], &arr[smallest]);
        i = smallest;
    }
}

int main() {
    int c, d, n;
    scanf("%d %d", &c, &d);
    scanf("%d", &n);

    int *heap = (int *)malloc(c * sizeof(int));
    if (heap == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        scanf("%d", &heap[i]);
    }

    int x;
    scanf("%d", &x);

    // 插入新元素
    heap[n] = x;
    siftUp(heap, n + 1, d, n);
    n++;

    // 删顶操作
    int min = heap[0];
    heap[0] = heap[n - 1];
    n--;
    siftDown(heap, n, d, 0);

    // 输出结果
    printf("min = %d\n", min);
    for (int i = 0; i < n; i++) {
        printf("%d\n", heap[i]);
    }

    return 0;
}    
相关推荐
YuTaoShao23 分钟前
【LeetCode 每日一题】1277. 统计全为 1 的正方形子矩阵
算法·leetcode·矩阵
古译汉书31 分钟前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法
野犬寒鸦33 分钟前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
阿昭L35 分钟前
leetcode两数之和
算法·leetcode
周树皮不皮38 分钟前
【Leetcode100】算法模板之二叉树
算法
无名客01 小时前
sentinel限流常见的几种算法以及优缺点
算法·sentinel·限流
GalaxyPokemon1 小时前
LeetCode - 1089. 复写零
数据结构
失散131 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
歪歪1002 小时前
qt creator新手入门以及结合sql server数据库开发
c语言·开发语言·后端·qt·数据库开发
Moonbit2 小时前
月报Vol.03: 新增Bitstring pattern支持,构造器模式匹配增强
后端·算法·github