二叉堆的基本操作

【堆的操作】:要求实现最大堆:

1、原始数据为 1 2 3 4 5 6 ,请构建二叉堆 ,依次打印二叉堆中的元素 

  2、打印堆中的最大元素并删除后,依次打印二叉堆中的元素 

/*1、原始数据为 1 2 3 4 5 6 ,请构建二叉堆 ,依次打印二叉堆中的元素
  2、打印堆中的最大元素并删除后,依次打印二叉堆中的元素
 */
#include<stdio.h>
#define MAXSIZE 100
#define MaxData 9999
#include <malloc.h>
typedef int ElementType;

/*堆结构体定义,采用顺序结构*/
typedef struct  HeapStruct {
    ElementType data[MAXSIZE];  /* 存储堆元素的数组 从下标1开始存储*/
    int Size;                    /* 堆的当前元素个数 */
} MaxHeap;

/**/
/*最大堆初始化*/
MaxHeap *CreateHeap( ) {
    MaxHeap *H = malloc( sizeof( MaxHeap ) );
    H->Size = 0;
    return H;
}

/* 将元素item 插入最大堆H */
void InsertHeap( MaxHeap *H, ElementType item ) {
        if (H->Size >= MAXSIZE) {
        printf("堆已满!\n");
        return;
    }
    /* 1.i指向插入后堆中的最后一个元素的位置 */
    int i = ++H->Size;
    /*2.堆化:插入的元素向上渗透*/
    while (i > 1 && item > H->data[i / 2]) {
        H->data[i] = H->data[i / 2];
        i /= 2;
    }
    H->data[i] = item;
}

/*自上而下堆化,即元素向下渗透*/
void HeapDown( MaxHeap *H, int r ) {
    /* 下滤:将H中以H->Data[r]为根的子堆调整为最大堆 */
    ElementType tmp = H->data[r];
    int i = 2 * r;
    while (i <= H->Size) {
        if (i < H->Size && H->data[i] < H->data[i + 1])
            i++;
        if (tmp >= H->data[i])
            break;
        H->data[r] = H->data[i];
        r = i;
        i *= 2;
    }
    H->data[r] = tmp;
}

/* 最大堆H元素删除 */
ElementType DeleteMax( MaxHeap *H ) {
    if (H->Size == 0) {
        printf("堆已空!\n");
        exit(1);
    }
    /* 1.取出根结点最大值,用最大堆中最后一个元素替换根节点元素 */
    ElementType maxItem = H->data[1];
    H->data[1] = H->data[H->Size--];
    /* 2.堆化:从根结点开始向下渗透*/
    HeapDown(H, 1);
    return maxItem;
}

/*建立二叉堆*/
void BuildHeap( MaxHeap *H ) {
    /* 元素已放入最大堆的数组中  */
    /* 调整H->data[]中的元素,使满足最大堆的有序性  */
    /* 堆化:从最后一个结点的父节点开始向下渗透,直到根结点1 */
    int i;
    for (i = H->Size / 2; i > 0; i--) {
        HeapDown(H, i);
    }
}


/*打印堆中的元素*/
void PrintHeap(MaxHeap *H) {
    int i;
    if (H->Size == 0) {
        printf("最大堆已为空");
        return;
    }
    printf("堆中的元素为:");
    for (i = 1; i <= H->Size; i++) {
        printf("%d ", H->data[i]);
    }
    printf("\n");
}
void main() {
    int i;
    MaxHeap *H = CreateHeap();
    //原始数据为 1 2 3 4 5 6
    for (i = 1; i <= 6; i++) {
        H->data[i] = i;
        H->Size++;
    }
    BuildHeap(H);
    PrintHeap(H);
    printf("取出当前堆中的最大元素为:%d\n", DeleteMax(H));
    PrintHeap(H);

}

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值