Huffman树编码

Huffman树定义:  树中 所有的子节点的带权路径长度之和最小的二叉树称为Huffman树.

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#define  MAX 20
using namespace std;

typedef struct HuffNode
{
 char  data;         //节点的值
 int   weigth;       //权值
 int   parent;       //双亲节点下标
 int   left;             //左孩子下标
 int   right;          //右孩子下标
};

typedef struct HuffCode
{
 char   number[MAX];                                   //数组
 int      start;                                                    //编码的起始下标
};

int _tmain(int argc, _TCHAR* argv[])
{
 HuffNode   huNode[2 * MAX];                      //N个子节点的Huffman树共有2n-1个节点
 HuffCode   huCode[MAX], code;
 int        i, k, l, x, y, r, n, num1, num2;
 cout << "请输入元素个数 :" << endl;
 cin  >> n;

 for (i = 1; i <= n; i++)
 {
  cout << "第" << i << "个元素 => /t 节点值 :" ;
  cin  >> huNode[i].data;
  cout << "  /t/t权重 :";
  cin  >> huNode[i].weigth;
 }

 for (i = 1; i <= 2*n-1; i++)
  huNode[i].parent = huNode[i].left = huNode[i].right = 0;

 for (i = n+1; i < 2*n-1; i++)
 {
  num1 = num2 = 32767;                        //设定初始值,用于求最小权中节点
  l = r = 0;                                                    //设置为最小权重的两个节点位置
  for (k =1; k <= i-1; k++)
   if (0 == huNode[k].parent)
    if (huNode[k].weigth < num1)
    {
     num2 = num1;
     r = 1;
     num1 = huNode[k].weigth;
     l = k;
    }
    else  if (huNode[k].weigth < num2)
    {
     num2 = huNode[k].weigth;
     r = k;
    }
    huNode[l].parent = i;
    huNode[r].parent = i;
    huNode[i].weigth = huNode[1].weigth + huNode[r].weigth;
    huNode[i].left   = l;
    huNode[i].right  = r;
 }

 for (i = 1; i <= n; i++)
 {
  code.start = n + 1;
  x = i;
  y = huNode[i].parent;
  while(y != 0)
  {
   if (x == huNode[y].left)
    code.number[--code.start] = '0';
   else
    code.number[--code.start] = '1';
   x = y;
   y = huNode[y].parent;
  }
  huCode[i] = code;
 }
 cout << "Huffman :" << endl;
 for(i = 1; i <= n; i++)
 {
  cout << huNode[i].data << " : ";
  for (k = huCode[i].start; k <= n; k++)
   cout << huCode[i].number[k];
  cout << endl;
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值