数据结构-哈夫曼树

介绍

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

什么是带权路径长度?

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

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

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

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

如何构建

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

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

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

重复此步骤,直到构成完整二叉树(只剩下9和6,则最后两个构成二叉树)

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

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

因此,构建步骤为:

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

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

3)将新树放回森林中,重复步骤2,直到构成一棵树为止

代码实现

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;
	}
}

相关推荐

  1. 数据结构及其编码

    2024-02-19 01:00:01       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-19 01:00:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-19 01:00:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-19 01:00:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-19 01:00:01       20 阅读

热门阅读

  1. C# 只允许开启一个exe程序

    2024-02-19 01:00:01       30 阅读
  2. [C++] 分支优化

    2024-02-19 01:00:01       29 阅读
  3. Leetcode-1523. 在区间范围内统计奇数数目

    2024-02-19 01:00:01       28 阅读
  4. 顺子日期 蓝桥杯

    2024-02-19 01:00:01       30 阅读
  5. 【orbslam2+nerf】

    2024-02-19 01:00:01       31 阅读
  6. Python 键盘模拟

    2024-02-19 01:00:01       28 阅读
  7. 24 双非计算机秋招总结

    2024-02-19 01:00:01       27 阅读
  8. 数据库事务的 4 种隔离级别

    2024-02-19 01:00:01       23 阅读
  9. C Primer Plus(第六版)16.17 复习题 第6题

    2024-02-19 01:00:01       25 阅读
  10. 110 C++ decltype含义,decltype 主要用途

    2024-02-19 01:00:01       24 阅读
  11. python - 文件

    2024-02-19 01:00:01       34 阅读