哈夫曼树和哈弗曼编码
一、存储结构
typedef struct {
int weight;
int lchild;
int rchild;
int parent;
} HufNode, * HufTree;
HufNode HT[ 2 * N- 1 ] ;
typedef struct {
char ch;
char code[ 10 ] ;
} Hcode;
Hcode HC[ N] ;
二、选取两个权值最下的下标
int s1, s2;
int select ( int n, int & p, int & q)
{
int i;
s1 = s2 = 9999999 ;
for ( i = 1 ; i<= n; i++ )
{
if ( HT[ i] . parent == 0 )
{
if ( HT[ i] . weight < s1)
{
s2 = s1;
q = p;
s1 = HT[ i] . weight;
p = i;
}
else if ( HT[ i] . weight < s2) {
s2 = HT[ i] . weight;
q = i;
}
}
}
}
三、构建哈夫曼树
void createHuf ( HufNode HT[ ] , int n)
{
int i;
int m = 2 * n- 1 ;
for ( i = 1 ; i<= n; i++ )
HT[ i] . parent = HT[ i] . lchild = HT[ i] . rchild = 0 ;
int p, q;
for ( i = n+ 1 ; i<= m; i++ )
{
select ( i- 1 , p, q) ;
HT[ i] . parent = 0 ;
HT[ p] . parent = HT[ q] . parent = i;
HT[ i] . lchild = p;
HT[ i] . rchild = q;
HT[ i] . weight = HT[ p] . weight + HT[ q] . weight;
}
}
四、进行哈夫曼编码
void HufCode ( int n)
{
int i, k;
char cod[ n] ;
for ( i = 1 ; i<= n; i++ )
{
int j = 0 ;
int c = i;
int ff = HT[ c] . parent;
while ( ff != 0 )
{
if ( HT[ ff] . lchild == c)
cod[ j++ ] = '0' ;
else
cod[ j++ ] = '1' ;
c = ff;
ff = HT[ c] . parent;
}
j-- ;
k= 0 ;
while ( j>= 0 )
{
HC[ i] . code[ k++ ] = cod[ j-- ] ;
}
HC[ i] . code[ k] = '\0' ;
}
}
五、打印哈夫曼编码
void printfHufCode ( )
{
int i, j;
for ( i = 1 ; i<= 5 ; i++ )
{
for ( j = 0 ; j< strlen ( HC[ i] . code) ; j++ )
printf ( "%c" , HC[ i] . code[ j] ) ;
printf ( "\n" ) ;
}
}
求二叉树的高度
int depth ( BiTree T)
{
int i, j;
if ( T == NULL )
return 0 ;
else {
i = depth ( T-> lchild) ;
j = depth ( T-> rchlid) ;
return ( i> j) ? ( i+ 1 ) : ( j+ 1 ) ;
}
}
求二叉树的节点数
int size ( BiTree T)
{
int i, j;
if ( T == NULL )
return 0 ;
else {
i = size ( T-> lchild) ;
j = size ( T-> rchlid) ;
return i+ j+ 1 ;
}
}