因为要考试了,所以我的编程也要放放了,不过每天还要多少看点,这连着今天搞的哈弗曼树今天终于能用代码实现了,不过又是参考别人的代码,然后自己写的,不是自己的,不过自己已经理解是怎么回事了,首先,还是说说我对哈弗曼树的一些看法吧: 哈弗曼树我现在所会的只是建立和编码,至于解码,到现在为止不会,不过,我还是想分享一下我自己对这两面的理解,首先,对于树的建立,要涉及到选取结点的问题,一,选择两个未选的两个权值最小的结点,这个涉及到一个函数的问题,至于,怎么来写,我想还是自己仔细想想,这个并不难,第二个,则是建立,那么建立的问题就有点纠结了,你想想着建立的树的大小,这个时候要仔细揣摩算法,明白,数的大小是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; |
}