6月11日数据结构——Huffman树

对于Huffman树最终该输出什么不清楚

#include<stdio.h>
#include<stdlib.h>
#define leafNumber 20      //默认权值集合大小
#define totalNumber 39     //数结点个数=2*leafNumber-1
typedef struct {
    char data;                   //结点的值
    int weight;                  //结点的权
    int Parent,lchild,rchild;    //双亲、左、右子女结点指针
}HTNode;
typedef struct {
    HTNode elem[totalNumber];     //Huffman树存储数组
    int num,root;                //num是外结点数,root是根
}HFTree;

//算法
void createHFTree (HFTree &HT,char value[],int fr[],int n){
    //输入数据value[n]和相应权值fr[n],构造用三叉链表表示的Huffman树HT
    int i,k,s1,s2;
    int min1,min2,maxWeight;
    for(i = 0;i<n;i++){                         //所有外结点赋值
        HT.elem[i].data=value[i];
        HT.elem[i].weight=fr[i];
    }
    for(int i= 0;i<n;i++){
        if(HT.elem[i].weight>HT.elem[i+1].weight){
            maxWeight = HT.elem[i].weight;
        }else
            maxWeight = HT.elem[i+1].weight;
    }
    for(i = 0;i<leafNumber;i++)                //所有指针置空
        HT.elem[i].Parent = HT.elem[i].lchild = HT.elem[i].rchild = -1;
    for(i = n;i<2*n-1;i++){                //逐步构造Huffman树
        min1 = min2 = maxWeight;                    //min1是最小值,min2是次小值
        s1 = s2 = 0;                       //s1是最小值点,s2是次小值点
        for(k = 0;k<i;k++)                 //构造Huffman树的过程
            if(HT.elem[k].Parent == -1)        //未成为其他树的子树
                if(HT.elem[k].weight<min1){     //新的最小值
                    min2 = min1;
                    s2 = s1;                  //原来的最小值变成次小值
                    min1 = HT.elem[k].weight;    //记忆新的最小值
                    s1 = k;
                }else if(HT.elem[k].weight<min2){   //新的次小值
                    min2 = HT.elem[k].weight;
                    s2 = k;
                }
            HT.elem[s1].Parent=HT.elem[s2].Parent=i;  //构造子树
            HT.elem[i].lchild=s1;
            HT.elem[i].rchild=s2;
            HT.elem[i].weight=HT.elem[s1].weight+HT.elem[s2].weight;
    }
    HT.num=n;
    HT.root=2*n-2;
} 

//输出Huffman树
void printMessage(HFTree &HT,char value[],int fr[],int n){
    for(int i = 0;i<n;i++){
        printf("%d\t",value[i]);
        printf("%d\t",fr[i]);
        printf("\n");
    }
}
main(){
    HFTree HT;
    int n,b[n];     //所需要的数据个数
    printf("请输入需要编码的字符个数:");
    scanf("%d",&n);
    char a[n];
    for(int i = 0;i<n;i++){
        printf("请输入第%d位数据:",i+1);
        scanf("%d",&a[i]);
    }
    for(int i = 0;i<n;i++){
        printf("请输入第%d位权值的数据:",i+1);
        scanf("%d",&b[i]);
    }
    createHFTree(HT,a,b,n);
    printMessage(HT,a,b,n);
} 

原文地址:https://www.cnblogs.com/lvzhiqi/p/11001327.html

时间: 2024-10-09 13:12:27

6月11日数据结构——Huffman树的相关文章

7月11日 bc总结

7月11日 bc总结 A题:暴力替换p,然后贪心求最大字段和.贪心求最大字段和的方法居然忘了... now每次加上a[i],如果now>ans,更新ans:如果now<0,now=0.也就是L移到下一个区间. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<vector>

ArrayList2014年6月11日07:26:00

1 //ArrayList是动态数组,方法有: 2 //Add----配合foreach一个个的添加 3 //AddRange-----以数组的形式,一次性添加 4 //Clear--------清空数组 5 //Count-----数组的长度 6 //Remove-----移除对应的元素 7 //RemoveAt------移除改索引对应的元素 8 //Contains------判断是否含所有某个值,返回Bool类型 9 //ToArray--------转换,再没关系(相当于复制一份) 泛

接口2014年6月11日01:11:37

1 [1]C#中的接口和类有什么异同. 2 3 不同点: 4 不能直接实例化接口. 5 接口不包含方法的实现. 6 接口可以多继承,类只能单继承. 7 类定义可在不同的源文件之间进行拆分(partial). 8 9 相同点: 10 接口.类和结构都可以从多个接口继承. 11 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员. 12 接口和类都可以包含事件.索引器.方法和属性(属性本质上是两个方法). 13 14 基础知识:接口只能定义方法(只能定义行为,不能定义实现也就是字段

5月11日上午学习日志

2017年5月11日上午把昨天记忆的英语单词的多种词意用自己组句的方法联系起来再记忆一遍,然后再联系真题学10个考研高频词汇,然后再复习昨天的词汇,再完成英语app的打卡.

4月11日作业

2016年4月11日作业 一.法律法规和标准规范1.中国标准划分为哪四个层次?要求最低的是哪个?1.国家标准 2.行业标准 3.地方标准 4.企业标准 最低要求是国家标准 2.国家标准的制订程序包括哪些?包括:前期准备.立项.起草.征求意见.审查.批准.出版.复审和废止9个阶段 3.ISO标准每几年复审一次?我国国家标准的有效期几年复审一次?标准每5年复审一次,国标有效期为5年,5年内进行复审 4.请说明如下是什么标准?GB.GB/T.GB/Z.GJB?国家标准代号为国标GB,推荐性国家标准代号

软考高项2016年4月11日作业

2016年4月11日作业 一.法律法规和标准规范1.中国标准划分为哪四个层次?要求最低的是哪个? 国家标准.行业标准.地方标准和企业标准,其中要求最低的是国家标准.2.国家标准的制订程序包括哪些? 前期准备.立项.起草.征求意见.审查.批准.出版.复审和废止3.ISO标准每几年复审一次?我国国家标准的有效期几年复审一次? ISO标准每五年复审一次,我国国家标准的有效期5年复审一次.4.请说明如下是什么标准?GB.GB/T.GB/Z.GJB? GB国家标准.GB/T推荐性国家标准.GB/Z国家标准

2015年1月MVP开始申请了~[截止时间:10月11日]

51CTO与微软中国合作长期为用户提供申请"微软最有价值专家"的平台希望有兴趣.资历的朋友以及正在朝这个方向努力的朋友能够积极参与只要您想参与我们将为您向微软推荐 微软最有价值专家MVP一年评选4次分别为每年的1月.4月.7月.10月.2015年1月的MVP申请截止时间是2015年10月11日. 申请MVP的午饭请下载2015年1月MVP申请表填好后发送到[email protected].我们会在每次MVP申请开始时把用户提交的申请表格推荐到微软中国相关部门 [注意事项]1.51CT

13家中国域名商(国际域名)解析量报告(8月11日)

IDC评述网(idcps.com)08月14日报道:根据DailyChanges公布的实时数据显示,截止至2015年8月11日,国内域名解析量前十三强名单顺序,环比上期8月4日,无变化.其中,分列1.8名的中国万网与爱名网表现出色,环比上期,各自净增22,556.16,482个解析量,增势强劲.下面,请看IDC评述网整理的具体数据情况. (图1)中国域名解析商(国际域名)解析量排行榜TOP13分布图 观察图1,可知截止至8月11日,中国域名解析量十三强较量中,中国万网.DNSPod与新网坚守三甲

8月11日全球域名商(国际域名)解析新增量TOP15

IDC评述网(idcps.com)08月14日报道:根据DailyChanges公布的最新数据显示,在2015年8月11日,全球域名解析新增量前三名依次是DOMAINCONTROL.COM.中国万网.DNSPod,新增解析量分别为26,772.5,584.4,398个.由此可见,DOMAINCONTROL.COM的优势巨大,地位无人可撼.接下来,请看IDC评述网对相关数据进行整理与分析. (图1)全球域名解析商(国际域名)解析新增量Top15分布图 如图1所示,在8月11日,全球域名解析新增量十