# 哈夫曼树及编码

/*在VC++里要删去getch()涵数和clrscr()涵数，可能是不支持吧！*/
/*win-tc*/
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"malloc.h"
#define Num 20
typedef struct huffmanNode  /*定义结点*/
{
int weight;
int parent;
int lchild;
int rchild;
}huffmanNode;
huffmanNode huffmanTree[2*Num-1];
char* huffmanCode[Num];

void HuffmanCoding(int n);
void Select(int n,int* s1,int* s2);
void CreateHuffmanTree(int data[],int len);
void main()
{
int i;
int index=0;
int value;
int nodelist[Num];
clrscr();            /*清屏涵数*/
printf("/nplease input the elements of binary tree(Exit for 0):/n/n");
index=0;
scanf("%d",&value);
while(value!=0)         /*输入叶子的权值，以0结束*/
{
nodelist[index]=value;
index++;
scanf("%d",&value);
}
CreateHuffmanTree(nodelist,index);
HuffmanCoding(index);
for(i=0;i<index;i++)
{
printf("/n%3d: [",huffmanTree[i].weight);
printf("%s",huffmanCode[i]);
printf("]");
}
getch();         /**/
}

void Select(int n,int* s1,int* s2)
{
int i;
if(n<2)
return;
for(i=0;i<n;i++)
{
if(huffmanTree[i].parent==0)
{
*s1=i;
break;
}
for(i=0;i<n;i++) /*选出第一个权值最小的结点*/
{
if(huffmanTree[*s1].weight>huffmanTree[i].weight)
*s1=i;
}
}
for(i=0;i<n;i++)
{
if((huffmanTree[i].parent==0)&&(*s1!=i))
{
*s2=i;
break;
}
}
for(i=0;i<n;i++)  /*选出第二个权值最小的结点*/
{
if((huffmanTree[i].parent==0)&&(*s1!=i))
{
if(huffmanTree[*s2].weight>huffmanTree[i].weight)
*s2=i;
}
}
}

/*创建*/
void CreateHuffmanTree(int data[],int len)
{
int i;
int m;
int s1=0,s2=0;
m=2*len-1;
for(i=0;i<len;i++)
{
huffmanTree[i].weight=data[i];
}
for(i=len;i<m;i++)
{
Select(i,&s1,&s2);
huffmanTree[s1].parent=i;  /*置父结点*/
huffmanTree[s2].parent=i;
huffmanTree[i].lchild=s1; /*生成新结点*/
huffmanTree[i].rchild=s2;
huffmanTree[i].weight=huffmanTree[s1].weight+huffmanTree[s2].weight;
}
}

/*编码*/
void HuffmanCoding(int n)
{
int i,j;
int start;
int current,father;
char* cd=(char*)malloc(n*sizeof(char));
cd[n-1]='/0';
for(i=0;i<n;i++)
{
start=n-1;
current=i;
father=huffmanTree[i].parent;
while(father)
{
if(huffmanTree[father].lchild==current)
cd[--start]='0';  /*父结点的左边设为0*/
else
cd[--start]='1';  /*父结点的左边设为1*/
current=father;
father=huffmanTree[father].parent;
}
huffmanCode[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(huffmanCode[i],&cd[start]);
}
free(cd);
}

• 本文已收录于以下专栏：

## 哈夫曼树的创建和编码

• wp1603710463
• 2016年03月19日 21:30
• 11758

## 数据结构(15)--哈夫曼树以及哈夫曼编码的实现

1.哈夫曼树     假设有n个权值{w1, w2, ..., wn}，试构造一棵含有n个叶子结点的二叉树，每个叶子节点带权威wi，则其中带权路径长度WPL最小的二叉树叫做最优二叉树或者哈夫曼树。  ...
• u010366748
• 2016年03月01日 17:28
• 6254

## 数组实现哈夫曼树及哈夫曼编码

• somehow1002
• 2015年11月27日 16:43
• 1188

## 数据结构之构造哈夫曼树及哈夫曼编码

• y20110220y
• 2013年12月15日 10:54
• 915

## 数据结构之---C语言实现哈夫曼树和编码

• u012965373
• 2015年07月03日 00:03
• 6055

## 哈夫曼树及哈夫曼树编码

• WHEgqing
• 2015年09月09日 15:50
• 334

## 哈夫曼树和编码

• fynjy
• 2015年08月05日 21:34
• 739

## 哈夫曼树构造及编码

• theArcticOcean
• 2015年06月22日 23:42
• 1727

## 哈夫曼树编码C语言实现

• qq_29187355
• 2017年05月06日 01:46
• 861

## 【数据结构】哈夫曼树实现编码译码

• a781558066
• 2015年01月07日 22:16
• 6779

举报原因： 您举报文章：哈夫曼树及编码 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)