简易的哈夫曼树

正在处于数据结构的学习中,用顺序表构造简易的哈夫曼树

【核心思想】1.比较出两个比较小的数

                      2.用两个比较小的数,组合一个根

                      3.用组合后的跟在和剩下的节点进行比较,反复

weigthparentlchrch

初始化weight赋值,并剩余所有的赋值为0,两数组合成新的数,修改parent的值,

 (默认下标是从1开始的)

weigthparentlchrch
3400
2400
4000
5032

反复操作,直到剩余最后一个元素的双亲为0,无法比较久退出(或者可以循环2n-1次)

#include <stdio.h>
#include <malloc.h>

//用顺序表存储哈夫曼树
typedef struct {
    int weight;
    int parent,lch,rch;
}HTNode,*HuffmanTree;

//从数组里比较出最小的  返回的是最小的下标
int CompareNode(HuffmanTree* h,int n,int *minIndex){
//    用a来存储最小的值
    int a;
//    用b来存储下标
    int b=0;

//    找到第一个parent为0的值
    for (int i = 1; i < 2*n-1; ++i) {
        if(h[i]->parent==0){
          a=h[i];
        }
    }
//    用第一个值和后面的值进行比较
    for (int i = 1; i <=2*n-1; ++i){
        if(h[i]->parent==0){
//            如果有比第一个parent为0小的值就进行转换
                    if(a<h[i+1]){
                        a=h[i+1];
                        b=i+1;
                    }
        }
    }
    minIndex=b;
//    如果他就是最小的就返回他
    return a;
}

//构造哈夫曼树
void CreatHuffmanTree(HTNode* node,int n,HuffmanTree *h,int a[]){
//    申请2n-1个节点
    h=(HTNode *)malloc(sizeof (HTNode)*2*n-1);
//    初始化前n个数
    for (int i = 1; i <= n; ++i) {
        h[i]->weight=a[i];
        h[i]->parent=0;
        h[i]->lch=0;
        h[i]->rch=0;
    }
//    进行比较对比
    for (int i = n+1; i <= 2*n-1; ++i) {
//        第一个小的下标
            int min;
//            第一个小的数
        int s1=CompareNode(h,n,&min);
//        将他的parent改为i
        h[min]->parent=i;
        int min2;
//        然后再找第二个数
        int s2=CompareNode(h,n,&min2);
        h[min]->parent=i;
        h[i]=s1+s2;
        h[i]->lch=min;
        h[i]->rch=min2;
    }
}


*****初学者,还望大佬指点*****

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值