数据结构之哈夫曼树和编码器的构造
时间:2022-05-08
本文章向大家介绍数据结构之哈夫曼树和编码器的构造,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在最近的自学数据结构的过程中,为加深树的理解,码了一个二叉树编码器,请多多指教:
#include
#define MAXBIT100
//最大子树
#define MAXVALUE10000
//最大值
#define MAXLEAF30
//最大编码数
#define MAXNODEMAXLEAF*2 -1
//最大节点数
typedef struct
{
int bit[MAXBIT];
int start;
} HCodeType;/*编码结构体*/
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
} HNodeType;/*结点结构体*/
/*构造哈夫曼树*/
void HuffmanTree(HNodeType HuffNode[MAXNODE],int n)
{
/* i、j:循环变量,m1、m2:构造哈夫曼树不同过程中两个最小权值结点的权值,
x1、x2:构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/
int i,j,m1,m2,x1,x2;
/*初始化存放哈夫曼树数组HuffNode[]中的结点*/
for(i=0;i<2*n-1;i++)
{
HuffNode[i].weight = 0;
HuffNode[i].parent =-1;
HuffNode[i].lchild =-1;
HuffNode[i].lchild =-1;
} /* end for */
/*输入n个叶子结点的权值*/
for(i=0;i
{
printf("Please input weight of leaf node %d: n",i);
scanf("%d",&HuffNode[i].weight);
} /* end for */
/*循环构造Huffman树*/
for(i=0;i
{
m1=m2=MAXVALUE;/* m1、m2中存放两个无父结点且结点权值最小的两个结点*/
x1=x2=0;
/*找出所有结点中权值最小、无父结点的两个结点,并合并之为一颗二叉树*/
for(j=0;j
{
if(HuffNode[j].weight < m1 && HuffNode[j].parent==-1)
{
m2=m1;
x2=x1;
m1=HuffNode[j].weight;
x1=j;
}
else if(HuffNode[j].weight < m2 && HuffNode[j].parent==-1)
{
m2=HuffNode[j].weight;
x2=j;
}
} /* end for */
/*设置找到的两个子结点x1、x2的父结点信息*/
HuffNode[x1].parent= n+i;
HuffNode[x2].parent= n+i;
HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
HuffNode[n+i].lchild = x1;
HuffNode[n+i].rchild = x2;
printf("x1.weight and x2.weight in round %d: %d,%dn",i+1,HuffNode[x1].weight,HuffNode[x2].weight);/*用于测试*/
printf("n");
} /* end for */
} /* end HuffmanTree */
int main(void)
{
HNodeType HuffNode[MAXNODE];/*定义一个结点结构体数组*/
HCodeType HuffCode[MAXLEAF],cd;/*定义一个编码结构体数组,同时定义一个临时变量来存放求解编码时的信息*/
int i,j,c,p,n;
printf("Please input n:n");
scanf("%d",&n);
HuffmanTree(HuffNode,n);
for(i=0;i < n;i++)
{
cd.start = n-1;
c = i;
p = HuffNode[c].parent;
while(p != -1)/*父结点存在*/
{
if(HuffNode[p].lchild == c)
cd.bit[cd.start]= 0;
else
cd.bit[cd.start]= 1;
cd.start--;/*求编码的低一位*/
c=p;
p=HuffNode[c].parent;/*设置下一循环条件*/
} /* end while */
/*保存求出的每个叶结点的哈夫曼编码和编码的起始位*/
for(j=cd.start+1;j
{ HuffCode[i].bit[j]= cd.bit[j];}
HuffCode[i].start = cd.start;
} /* end for */
/*输出已保存好的所有存在编码的哈夫曼编码*/
for(i=0;i
{
printf("%d 's Huffman code is: ",i);
for(j=HuffCode[i].start+1;j < n;j++)
{
printf("%d",HuffCode[i].bit[j]);
}
printf("n");
}
getchar();
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法