数据结构-哈夫曼树

这篇具有很好参考价值的文章主要介绍了数据结构-哈夫曼树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

哈夫曼树,指带权路径长度最短的二叉树,通常用于数据压缩中

什么是带权路径长度?

假设有一个结点,我们为它赋值,这个值我们称为权值,那么从根结点到它所在位置,所经历的路径,与这个权值的积,就是它的带权路径长度。

比如有这样一棵树,D权值为2

数据结构-哈夫曼树,数据结构,算法

 从根结点到D的路径为2,则此结点带权路径长度为2x2=4

当一棵二叉树所有结点的带权路径之和最小时,这棵树就被称为哈夫曼树

如何构建

假设已经有若干带权值的结点

数据结构-哈夫曼树,数据结构,算法

首先需要选出权值最小的两个结点(1,3)构建二叉树

数据结构-哈夫曼树,数据结构,算法

此时根结点权值为1x1+3x1=4,将其放回,再从所有结点中选取最小的重新组成新的二叉树

数据结构-哈夫曼树,数据结构,算法

重复此步骤,直到构成完整二叉树(只剩下9和6,则最后两个构成二叉树)数据结构-哈夫曼树,数据结构,算法

这样,就构成了一棵哈夫曼树

这棵树的最小带权路径和为1x3+3x3+5x2+6x1=28 

因此,构建步骤为:

1)创建一个包含所有结点及权值的森林

2)选取两棵权值最小的树合并构成新树,其根结点的权值为这两棵树结点权值之和

3)将新树放回森林中,重复步骤2,直到构成一棵树为止文章来源地址https://www.toymoban.com/news/detail-828582.html

代码实现

int m1,m2;//全局变量方便传递
struct tree {//结构体定义
	int weight;
	int p;
	int l;
	int r;
};
struct hftree {
	tree* data;
	int len;
};

//查找最小的两个权值
void select(hftree* T) {
	int min_;
	for (int i=0; i<T->len; i++) {
		if (T->data[i]->p==0) { //选取没有父结点的结点(已有父结点的已经构成树)
			min_=i;//先为min_赋一个初始值
		}
	}
	for (int i=0; i<T->len; i++) { //找第一个最小值
		if (T->data[i]->p==0) {
			if (T->data[i]->weight<min_) min_=i;
		}
	}
	m1=min_;
	for (int i=0; i<T->len; i++) {
		if (T->data[i]->p==0&&i!=m1) {
			min_=i;
		}
	}

	for (int i=0; i<T->len; i++) { //找第二个最小值
		if (T->data[i]->p==0) {
			if (T->data[i]->weight<min_&&T->data[i]->weight!=m1) min_=i;
		}
	}
	m2=min_;
}

//创建哈夫曼树
void creathftree(int* weight,int n) {//传入权值与·结点数
	int m=2*n-1;//总结点数(当有n个结点待构成哈夫曼树时,构成的树一共有2n-1个结点)
	hftree* T=(hftree*)malloc(sizeof(hftree));//开辟空间
    T->data=(tree*)malloc(sizeof(tree)*m);//分配data数组内存
    T->len=n;
    for (int i=0;i<n;i++){
    	T->data[i]->weight=weight[i];//赋权值
	}
	for (int i=n;i<m;i++){
		select(T,i-1);//在第0到i-1个所有结点内查找
		T->data[i]->weight=T->data[m1]->weight+T->data[m2]->weight;//新结点权值为最小两权值之和
		T->data[m1]->p=i;//结点i为最小两个结点的父结点
		T->data[m2]->p=i;
		T->data[i]->l=m1;//权值为m1与m2的结点归为i的左右孩子
		T->data[i]->r=m2;
	}
}

到了这里,关于数据结构-哈夫曼树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】哈夫曼编码(最优二叉树)实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(46)
  • 数据结构“基于哈夫曼树的数据压缩算法”的实验报告

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.11.20 目录 数据结构“基于哈夫曼树的数据压缩算法”的实验报告 一、实验目的 二、实验设备 三、实验内容 1.【问题描述】 2.【输入要求】 3.【输出要求】 4.【实验提示】 四、实验步骤

    2024年02月09日
    浏览(57)
  • 【数据结构与算法】哈夫曼编码(最优二叉树实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(44)
  • 数据结构与算法(C语言版)---哈夫曼编译码器

    1.1、问题阐述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道) ,每端都需要一个完整的编/译

    2024年02月03日
    浏览(82)
  • 数据结构——哈夫曼树与哈夫曼编码

    1.1 基本概念 路径 :指从根结点到该结点的分支序列。 路径长度 :指根结点到该结点所经过的分支数目。 结点的带权路径长度 :从树根到某一结点的路径长度与该结点的权的乘积。 树的带权路径长度(WPL) :树中从根到所有叶子结点的各个带权路径长度之和。 哈夫曼树 是由

    2024年02月05日
    浏览(42)
  • 数据结构之哈夫曼树和哈夫曼编码

    切入正题之前,我们先了解几个概念: 路径:从树的一个结点到另一个结点分支所构成的路线 路径长度:路径上的分支数目 树的路径长度:从根结点出发到每个结点的路径长度之和 带权路径长度:该结点到根结点的路径长度乘以该结点的权值 树的带权路径长度:树中所有

    2024年02月11日
    浏览(43)
  • 数据结构之哈夫曼树与哈夫曼编码

    编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。 但其在传输和存储等情况下编码效率不高 。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例

    2023年04月15日
    浏览(61)
  • 数据结构课程实验五:哈夫曼树与哈夫曼编码

    实验日期:2022-12-20   目录 一、实验目的 1、掌握哈夫曼树的建立 2、掌握哈夫曼编码方式 二、实验内容

    2024年02月05日
    浏览(46)
  • 数据结构【哈夫曼树】

    最优二叉树也称哈夫曼 (Huffman) 树 ,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。权值是指一个与特定结点相关的数值。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 涉及到的几个概念: 路径: 从树中一个结点到另一个结

    2024年02月14日
    浏览(36)
  • 数据结构----哈夫曼树

    哈夫曼树就是寻找构造最优二叉树,用于提高效率 各种路径长度 各种带权路径长度 结点的带权路径长度 树的带权路径长度 哈夫曼树 带权路径长度最短的树或者二叉树 也就是树的叶子结点带权路径长度之和 :也就是叶子结点的结点路径长度(根结点到叶子结点的路径数)

    2024年01月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包