哈夫曼树
#include <stdio.h>
const int n = 5;
typedef struct
{
int weight;
int parent,lchild,rchild;
}element;
char ch[n] = {'A','B','C','D','E'};
int w[n] = {35,25,15,15,10};
void HuffmanTree(element huffTree[])
{
int i,k;
int i1,i2;
for(i=0;i<2*n-1;i++)
{
huffTree[i].parent = -1;
huffTree[i].lchild = -1;
huffTree[i].rchild = -1;
}
for(i=0;i<n;i++)
huffTree[i].weight = w[i]; //初始化,构造n课只含根结点的二叉树
for(k=n;k<2*n-1;k++) //进行n-1次合并
{
Select(huffTree,k,i1,i2);
huffTree[k].weight = huffTree[i1].weight + huffTree[i2].weight;
huffTree[i1].parent = k; //将i1、i2合并,双亲为k
huffTree[i2].parent = k;
huffTree[k].lchild = i1;
huffTree[k].rchild = i2;
}
}
void Select(element huffTree[],int k,int &i1,int &i2)
{
int min1 = min2 = 100;
for(int i=0;i<k,i++)
{
if(huffTree[i].parent == -1)
{
if(huffTree[i].weight < min1)
{
min2 = min1;i2 = i1;
min1 = huffTree[i].weight;i1 = i;
}else if(huffTree[it].weight < min2)
{
min2 = huffTree[i].weight;
i2 = i;
}
}
}
}
void HuffmanCode(element huffTree[])
{
int i,j,k;
int S[n],top = -1;
for(i=0;i<n;i++)
{
printf("字符%c的编码是:",ch[i]);
k = i;
while(huffTree[k].parent != -1)
{
j = HuffmanTree[k].parent;
if(huffTree[j].lchild == k)
S[++top] = '0';
else
S[++top] = '1';
k = j;
}
while(top > -1)
printf("%c",S[top--]);
printf("\n";)
}
}
int main()
{
element huffTree[2*n-1];
HuffmanTree(huffTree);
HuffmanCode(huffTree);
return 0;
const int n = 5;
typedef struct
{
int weight;
int parent,lchild,rchild;
}element;
char ch[n] = {'A','B','C','D','E'};
int w[n] = {35,25,15,15,10};
void HuffmanTree(element huffTree[])
{
int i,k;
int i1,i2;
for(i=0;i<2*n-1;i++)
{
huffTree[i].parent = -1;
huffTree[i].lchild = -1;
huffTree[i].rchild = -1;
}
for(i=0;i<n;i++)
huffTree[i].weight = w[i]; //初始化,构造n课只含根结点的二叉树
for(k=n;k<2*n-1;k++) //进行n-1次合并
{
Select(huffTree,k,i1,i2);
huffTree[k].weight = huffTree[i1].weight + huffTree[i2].weight;
huffTree[i1].parent = k; //将i1、i2合并,双亲为k
huffTree[i2].parent = k;
huffTree[k].lchild = i1;
huffTree[k].rchild = i2;
}
}
void Select(element huffTree[],int k,int &i1,int &i2)
{
int min1 = min2 = 100;
for(int i=0;i<k,i++)
{
if(huffTree[i].parent == -1)
{
if(huffTree[i].weight < min1)
{
min2 = min1;i2 = i1;
min1 = huffTree[i].weight;i1 = i;
}else if(huffTree[it].weight < min2)
{
min2 = huffTree[i].weight;
i2 = i;
}
}
}
}
void HuffmanCode(element huffTree[])
{
int i,j,k;
int S[n],top = -1;
for(i=0;i<n;i++)
{
printf("字符%c的编码是:",ch[i]);
k = i;
while(huffTree[k].parent != -1)
{
j = HuffmanTree[k].parent;
if(huffTree[j].lchild == k)
S[++top] = '0';
else
S[++top] = '1';
k = j;
}
while(top > -1)
printf("%c",S[top--]);
printf("\n";)
}
}
int main()
{
element huffTree[2*n-1];
HuffmanTree(huffTree);
HuffmanCode(huffTree);
return 0;
}