第一范文网 - 专业文章范例文档资料分享平台

哈工大数据结构大作业 - 哈夫曼树生成、编码、遍历

来源:用户分享 时间:2025/5/15 23:16:33 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

一、 问题描述

1. 用户输入字母及其对应的权值,生成哈夫曼树;

2. 通过最优编码的算法实现,生成字母对应的最优0、1编码; 3. 先序、中序、后序遍历哈夫曼树,并打印其权值。

二、 方法思路

1.哈夫曼树算法的实现 §存储结构定义

#define n 100 /* 叶子树*/

#define m 2*(n) –1 /* 结点总数*/ typedef struct { /* 结点型*/ double weight ; /* 权值*/ int lchild ; /* 左孩子链*/ int rchild ; /* 右孩子链*/ int parent; /* 双亲链*/ 优点? }HTNODE ;

typedef HTNODE HuffmanT[ m ] ; /* huffman树的静态三叉链表表示*/

算法要点

1)初始化:将T[0],…T[m-1]共2n-1个结点的三个链域均置空( -1 ),权值为0;

2)输入权值:读入n 个叶子的权值存于T的前n 个单元 T[0],…T[n], 它们是n 个独立的根结点上的权值; 3)合并:对森林中的二元树进行n-1次合并,所产生的新结点

依次存放在T[i](n<=i<=m-1)。每次合并分两步:

-可编辑修改-

(1) 在当前森林中的二元树T [0],…T[i-1]所有结点中选取权值

最小和次最小的两个根结点T[p1]和T[p2]作为合并对象,这

里0<= p1,p2<= i –1;

(2) 将根为T[p1]和T[p2]的两株二元树作为左、右子树合并为一

株新二元树,新二元树的根结点为T[i]。即

T[p1].parent =T[p2].parent = i ,T[i].lchild= p1, T[i].rchild=p2, T[p2].weight。

2.用huffman算法求字符集最优编码的算法:

1) 使字符集中的每个字符对应一株只有叶结点的二叉树,

叶的权值为对应字符的使用频率;

2) 利用huffman算法来构造一株huffman树; 3) 对huffman树上的每个结点,左支附以0,右支附以

1(或者相反),则从根到叶的路上的0、1序列就是相应字符的编码 Huffman编码实现: 存储结构

typedef struct{ char ch; //存储字符

char bits[n+1]; //字符编码位串 }CodeNode;

typedef CodeNode HuffmanCode[n]; HuffmanCode H; 3.二叉树遍历的递归定义

T[i].weight

=T[p1].weight

+

-可编辑修改-

先根顺序遍历二叉树: 若二叉树非空则: {

访问根结点; 先根顺序遍历左子树; 先根顺序遍历右子树; }

中根顺序遍历二叉树: 若二叉树非空则:

{

中根顺序遍历左子树; 访问根结点;

中根顺序遍历右子树; } 后根顺序遍历二叉树: 若二叉树非空则: { 后根顺序遍历左子树; 后根顺序遍历右子树; 访问根结点; } ;

三、主要数据结构及源程序代码及其注释 1.扩充二叉树:内结点、外结点 (增长树)

-可编辑修改-

2.哈夫曼树

3. Huffman编码实现

源程序代码及注释

#include \#include #include #include #define n 10

-可编辑修改-

哈工大数据结构大作业 - 哈夫曼树生成、编码、遍历.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c92won7u1n74n25q6ny0j2r4yi9c8hj003v9_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top