关于哈弗曼树的问题

因为要考试了,所以我的编程也要放放了,不过每天还要多少看点,这连着今天搞的哈弗曼树今天终于能用代码实现了,不过又是参考别人的代码,然后自己写的,不是自己的,不过自己已经理解是怎么回事了,首先,还是说说我对哈弗曼树的一些看法吧:

哈弗曼树我现在所会的只是建立和编码,至于解码,到现在为止不会,不过,我还是想分享一下我自己对这两面的理解,首先,对于树的建立,要涉及到选取结点的问题,一,选择两个未选的两个权值最小的结点,这个涉及到一个函数的问题,至于,怎么来写,我想还是自己仔细想想,这个并不难,第二个,则是建立,那么建立的问题就有点纠结了,你想想着建立的树的大小,这个时候要仔细揣摩算法,明白,数的大小是2*n-1,然后再一点点的删除与加入,直至只剩下最后一个为止,但是在这之前,我们要进行初始化,也就是要把所有的权值的那个树都当成一个简单的树来处理,也就是n个树。这基本就是主要的思想,同时,我觉得还有一个重要的是分配空间的问题,这个很重要,一定不要忘记,也就是你用一个指针在没有初始化的前提下,你必须得分配一个空间给他,让他指向那个空间。

下来我谈一下编码的问题,对于编码我觉得一个重要的是结束符的问题,也就是必须标记最后的一个结束符为‘/0’;然后就是数的读取编码,一般情况下,我们定义向左边走位为0,而像右边走时,位为1。那么怎么来使用这个位呢,这就要涉及的是,我们要从上到下来进行编码,但是输出的时候,我们不能这样了,因为要编码的不止一个,所以涉及到一个复制的问题,总之,我们还是先看看代码吧,我觉得代码的思想还是比较简单的,虽然我看了很长的时间,自己实现也用了很长时间,但是我觉得这个思想还是比较通俗易懂的!!

C语言: Codee#11712
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAX 10
typedef struct node
{
    int weight;
    int rchild , lchild , parent;
} * Haffmantree , haffmantree;
typedef char * * Haffmancode;
void select( Haffmantree * ht , int n , int * s1 , int * s2)
{
    int i;
    int min;
    for( i = 0; i <n; i ++)
    {
        if(( * ht )[ i ]. parent == 0)
        {
            min = i;
            break;
        }
    }
    for( i = 0; i <n; i ++)
    {
        if(( * ht )[ i ]. weight <( * ht )[ min ]. weight)
        {
            if(( * ht )[ i ]. parent == 0)
            {
                min = i;
            }
        }
    }
    * s1 = min;
    for( i = 0; i <n; i ++)
    {
        if(( * ht )[ i ]. parent == 0 && i !=* s1)
        {
            min = i;
            break;
        }
    }
    for( i = 0; i <n; i ++)
    {
            if(( * ht )[ i ]. parent == 0)
        if(( * ht )[ i ]. weight <( * ht )[ min ]. weight && i !=* s1)
        {
       
            {
                min = i;
            }
        }
    }
    * s2 = min;
}
void create_Haffmantree( Haffmantree * ht , int w [], int n)
{
    int i;
    int s1 , s2;
    int m = 2 *n - 1;
    ( * ht) =( Haffmantree) malloc( sizeof( struct node) *( m + 1));
    for( i = 0; i <n; i ++)
    {
        ( * ht )[ i ]. weight = w [ i ];
        ( * ht )[ i ]. lchild = 0;
        ( * ht )[ i ]. rchild = 0;
        ( * ht )[ i ]. parent = 0;
    }
    for( i =n; i < m; i ++)
    {
        ( * ht )[ i ]. weight = 0;
        ( * ht )[ i ]. lchild = 0;
        ( * ht )[ i ]. rchild = 0;
        ( * ht )[ i ]. parent = 0;
    }
    for( i =n; i < m; i ++)
    {
        select( ht , i - 1 , & s1 , & s2);
        ( * ht )[ i ]. lchild = s1;
        ( * ht )[ i ]. rchild = s2;
        ( * ht )[ s1 ]. parent = i;
        ( * ht )[ s2 ]. parent = i;
        ( * ht )[ i ]. weight =( * ht )[ s1 ]. weight +( * ht )[ s2 ]. weight;
        printf( "%d (%d %d)" ,( * ht )[ i ]. weight ,( * ht )[ s1 ]. weight ,( * ht )[ s2 ]. weight);
    }
}
void Search( Haffmantree * ht , Haffmancode * hc , int n)
{
    int i;
    char * cd;
    int p , c;
    int start;
    hc =( Haffmancode) malloc( sizeof( char *) *n);
    cd =( char *) malloc( sizeof( char));
    cd [n - 1 ] = '/0';
    for( i = 0; i <n; i ++)
    {
        start =n - 1;
        for( c = i ,p =( * ht )[ i ]. parent;p != 0; c =p ,p =( * ht )[p ]. parent)
        {
            if(( * ht )[p ]. rchild == c)
            {
                cd [ -- start ] = '0';
            }
            else
            {
                cd [ -- start ] = '1';
            }
        }
        hc [ i ] =( Haffmantree) malloc( sizeof( struct node) *(n - start));
        strcpy( hc [ i ], & cd [ start ]);
        printf( " /n %s /n " , hc [ i ]);
    }
}
int main()
{
    Haffmantree ht [ 100 ];
    Haffmancode hc;
//    int i;
    int w [ 100 ];
    int n;
    int i;
    scanf( "%d" , &n);
    for( i = 0; i <n; i ++)
    {
        scanf( "%d" , & w [ i ]);
    }
    create_Haffmantree( ht , w ,n);
    Search( ht , hc ,n);
    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值