博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈夫曼树的创建和编码
阅读量:3943 次
发布时间:2019-05-24

本文共 1118 字,大约阅读时间需要 3 分钟。

算法思路:

  1. 以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点;
    (2) 在F中选取两棵根结点权值最小的树作为左右子树构造一棵新二叉树,并且置新二叉树根结点权值为左右子树上根结点的权值之和(根结点的权值=左右孩子权值之和,叶结点的权值= Wi)
    (3) 从F中删除这两棵二叉树,同时将新二叉树加入到F中;
    (4)重复(2)、(3)直到F中只含一棵二叉树为止,这棵二叉树就是Huffman树。

编码原理:

对于给定的字符集D={d1,d2,…,dn}及其频率分布F={w1,w2,…,wn},用d1,d2,…,dn作为叶结点,w1,w2,…,wn作为结点的权,利用哈夫曼算法构造一棵最优二叉树,将树中每个分支结点的左分支标上"0";右分支标上"1",把从根到每个叶子的路径符号(“0"或"1”)连接起来,作为该叶子的编码。

程序实现:

首先通过 HuffmanTree() 函数构造哈夫曼树,然后在主函数 main()中, 自底向上开始(也就是从数组序号为零的结点开始)向上层层判断,若在父结点左侧,则置码为 0,若在右侧,则置码为 1,最后输出生成的编码。

#include 
#define MAXBIT 100#define MAXVALUE 10000#define MAXLEAF 30#define MAXNODE MAXLEAF*2 -1typedef 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){ int i, j, m1, m2, x1, x2; for (i=0; i<2*n-1; i++) //初始化存放哈夫曼树数组 HuffNode[] 中的结点 { HuffNode[i].weight = 0; HuffNode[i].parent =-1; HuffNode[i].lchild =-1; HuffNode[i].lchild =-1; } for (i=0; i

在这里插入图片描述

转载地址:http://nrjwi.baihongyu.com/

你可能感兴趣的文章
回文链表
查看>>
容器盛水问题
查看>>
滑动窗口最大值
查看>>
win7 文件删除后要刷新后才会消失
查看>>
用ffmpeg转多音轨的mkv文件
查看>>
ubuntu12.04 安装VLC,在root用户下不能使用的问题
查看>>
简单而又完整的Makefile
查看>>
GNU/Linux下如何卸载源码安装的软件
查看>>
ffmpeg 常用 命令随手记
查看>>
av_seek_frame中flags值的意义
查看>>
git 学习笔记
查看>>
C++类中的static的用法
查看>>
vector 释放内存 swap
查看>>
在linux下新增一块硬盘的操作。(包含大于2T的硬盘在linux下挂载操作)
查看>>
在32位系统中使用fseek和lseek或fwrite、write写大文件时,最大只能写2G左右的解决办法
查看>>
整理华为C/C++编码规范
查看>>
C语言中嵌入正则表达式
查看>>
libxml2 指南(中文)
查看>>
虚拟机VMware中实现linux与windows的共享
查看>>
undefined reference问题总结
查看>>