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;
}