哈夫曼树的构造C/C++代码实现

本文介绍了哈夫曼树的概念,它是带权路径长度最小的二叉树。文章详细阐述了哈夫曼树的构造过程,通过每次合并权值最小的两个节点来构建,并讨论了哈夫曼树的存储方式,存储于一个一维数组中,叶子节点存储在前半部分。此外,还提供了相应的C/C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈夫曼树:

所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树。

哈夫曼树的构造:

根据哈夫曼树的特点:权值越大的结点离根结点越近。
具体方法:依次选择权值最小的二个结点作为左右子树构造一颗新的二叉树,其产生的根结点的权值为左右子树权值之和。一直重复直到只含一棵树为止。‘

权值:
在这里插入图片描述
哈夫曼树:
在这里插入图片描述

哈夫曼树的存储:

由于哈夫曼树中没有度为1 的结点,则一棵有n个叶子结点的哈夫曼树共有 2n-1个结点,可以存储在一个大小为2n-1的一维数组中。
为了实现方便,数组的0号单元不使用,从1号单元开始使用,所以数组的大小为2n,。将叶子结点集中存储在前面部分 1~n个位置。
在这里插入图片描述

代码如下:

#include<stdio.h>
#include<iostream>

//哈夫曼树定义
typedef struct {
   
   
	int weight;
	int parent, lchild, rchild;
}HTNode, *HuffmanTree;

//选择两个双亲域为0且权值最小的结点,并返回在HT中的序号s1,s2
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{
   
   
	//寻找第一个双亲域为0且权值最小的结点
	int min;
	for (int i = 1; i <= n; i++)	//找到第一个双亲域为0的,下标暂存到min
	{
   
   
		if (HT[i].parent == 0)
		{
   
   
			min = i;
			break;
		}
	}

	for (int i = 1; i <= n; i
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值