数据结构-二叉树(Huffman算法)


huffman算法即最优二叉树的实现:(其中用到的堆栈算法在前面的文章中以列出)ContractedBlock.gifCode

  1  //  Huffman.cpp : 定义控制台应用程序的入口点。
  2  //
  3 
  4  #include  " stdafx.h "
  5  #include  " stack.h "
  6  #include  < stdlib.h >
  7  #define  MAXINT 2147483647
  8  #define  MAXNODE 100
  9 
 10  struct  HtNode
 11  {
 12       int  ww;
 13       int  parent, llink, rlink;
 14  };
 15 
 16  struct  HtTree
 17  {
 18       struct  HtNode ht[MAXNODE];
 19       int  root;
 20       int  count;
 21  };
 22 
 23  typedef  struct  HtTree  *  PHtTree;
 24 
 25  PHtTree huffman( int  m,  int   *  w)
 26  /*  构造具有m 个叶子节点的哈夫曼树 */
 27  {
 28      PHtTree pht;
 29       int  i, j, x1, x2, m1, m2;
 30      pht  =  (PHtTree)malloc( sizeof ( struct  HtTree));
 31       if (pht  ==  NULL)
 32      {
 33          printf( " Out of space!!\n " );
 34           return  pht;
 35      }
 36      pht -> count  =  m;
 37       for (i  =   0 ; i  <   2   *  m  -   1 ; i ++ )
 38      {
 39          pht -> ht[i].llink  =   - 1 ;
 40          pht -> ht[i].rlink  =   - 1 ;
 41          pht -> ht[i].parent  =   - 1 ;
 42           if (i  <  m)
 43              pht -> ht[i].ww  =  w[i];
 44           else
 45              pht -> ht[i].ww  =   - 1 ;
 46      }
 47 
 48       for (i  =   0 ; i  <  m  -   1 ; i ++ )
 49      {
 50          m1  =  MAXINT, m2  =  MAXINT;
 51          x1  =   - 1 ; x2  =   - 1 ;
 52           for (j  =   0 ; j  <  m  +  i; j ++ )
 53          {
 54               if (pht -> ht[j].ww  <  m1  &&  pht -> ht[j].parent  ==   - 1 )
 55              {
 56                  m2  =  m1;
 57                  x2  =  x1;
 58                  m1  =  pht -> ht[j].ww;
 59                  x1  =  j;
 60              }
 61               else
 62              {
 63                   if (pht -> ht[j].ww  <  m2  &&  pht -> ht[j].parent  ==   - 1 )
 64                  {
 65                      m2  =  pht -> ht[j].ww;
 66                      x2  =  j;
 67                  }
 68              }
 69          }
 70          pht -> ht[x1].parent  =  m  +  i;  /* 构造一个内部节点 */
 71          pht -> ht[x2].parent  =  m  +  i;
 72          pht -> ht[m  +  i].ww  =  m1  +  m2;
 73          pht -> ht[m  +  i].llink  =  x1;
 74          pht -> ht[m  +  i].rlink  =  x2;
 75          pht -> root  =  m  +  i;
 76      }
 77       return  pht;
 78  }
 79 
 80  void  printThreeEncode(PHtTree tree)
 81  {
 82      PSeqStack pastack  =  createEmptyStack_seq();
 83       int  j;
 84       for ( int  i  =   0 ; i  <  tree -> count; i ++ )
 85      {
 86          printf( " Eoncode for W %d is:  " ,tree -> ht[i].ww );
 87          j  =  i;
 88          HtNode node  =  tree -> ht[i];
 89           do
 90          {
 91               if (tree -> ht[node.parent].llink  ==  j )
 92              {
 93                  push_seq(pastack, 0 );
 94              }
 95               else
 96              {
 97                  push_seq(pastack, 1 );
 98              }
 99              j  =  node.parent;
100              node  =  tree -> ht[j];
101          }
102           while (j  !=  tree -> root);
103           int  code;
104           while ( ! isEmptyStack_seq(pastack))
105          {
106              code  =  top_seq(pastack);
107              pop_seq(pastack);
108              printf( "  %d  " , code);
109          }
110          printf( " \n " );
111 
112      }
113  }
114 
115  int  _tmain( int  argc, _TCHAR *  argv[])
116  {
117       int  w[]  =  { 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 };
118      printThreeEncode(huffman( 13 ,w));
119       return   0 ;
120  }

121  

运行结果为:

 Eoncode for W 2 is:  1  0  1  1  1  1  0 

Eoncode for W 3 is:  1  0  1  1  1  1  1 

Eoncode for W 5 is:  1  0  1  1  1  0 

Eoncode for W 7 is:  1  0  1  1  0 

Eoncode for W 11 is:  0  1  0  0 

Eoncode for W 13 is:  0  1  0  1 

Eoncode for W 17 is:  1  0  1  0 

Eoncode for W 19 is:  0  0  0 

Eoncode for W 23 is:  0  0  1 

Eoncode for W 29 is:  0  1  1 

Eoncode for W 31 is:  1  0  0 

Eoncode for W 37 is:  1  1  0 

Eoncode for W 41 is:  1  1  1 


转载于:https://www.cnblogs.com/LarmanYuan/archive/2009/06/25/1511123.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值