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

Posted lvzhiqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
 

 

以上是关于6月11日数据结构——Huffman树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构树 —— 编程作业 11 :Huffman Codes

学习数据结构笔记(10) --- [赫夫曼树(Huffman Tree)与赫夫曼编码(Huffman coding)]

Huffman树实现编码译码--数据结构实验

数据结构之huffman树

数据结构 05-树9 Huffman Codes (30 分)

22计算机408考研—数据结构—树定义,遍历,Huffman,并查集