Huffman树的构造

博客涉及二叉树、数据结构和算法相关内容,以C++实现,虽仅提及运行结果,但推测围绕这些信息技术领域关键元素展开,展现了相关代码运行后的情况。

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

#include <iostream>
#include <vector>
using namespace std;
/*
哈夫曼树的构造过程
给定一个权值数组 data[] 长度为N

建立N棵只有一个根节点二叉树(注意是二叉树)
用一个集合容器保存

合并:
每次选择权值最小的两棵树进行合并,并删除原容器中用来合并的两棵树,把新的树加入到容器中
迭代此过程
直到容器中只剩一棵树为止。该树就是要求的huffman树

*/


//定义树的结构
 struct TreeNode {
	int data;
	TreeNode* leftChild;
	TreeNode* rightChild;
};

 //构造哈夫曼树
TreeNode* getHuffmanTree(int *data,int len) /* len是权值数组长度*/
{
	//求数组长度
	//int len = 10;

	/*int len = sizeof(data);
	int len1 = 	sizeof(data[0]);
	cout << len << endl;

	cout << len1;*/

	//1.构造len棵只有根节点的二叉树并加入一个树的集合中
	vector<TreeNode*> vt; //声明树的集合
	for (int i = 0; i < len; i++)
	{
		TreeNode* node= new TreeNode;
		node->data = data[i];
		node->leftChild = NULL;
		node->rightChild = NULL;
		vt.push_back(node);
	}

	vector<TreeNode*>::iterator it; //声明迭代器
	TreeNode* minWeight;   //最小的
	TreeNode* secondminWeight; //第二小的
	//2.选取并进行合并 首先考虑N个元素每次选两个 合并操作要进行几次 归纳出次数显然为N-1
	for (int i = 0; i < len - 1; i++)
	{
		//遍历选择权值最小的 通过迭代器遍历
		//假设第一个权值最小
		minWeight = vt.front();
		vector<TreeNode*>::iterator ittemp = vt.begin();  //临时迭代器用于存储最小元素的位置
		for (it = vt.begin(); it != vt.end(); ++it)
		{
			if ((*it)->data < minWeight->data)
			{
				minWeight = *it;
				ittemp = it;
			}
		}
		//找到了最小的之后删除
		vt.erase(ittemp);

		//再进行一次查找第二小的
		secondminWeight = vt.front();
		vector<TreeNode*>::iterator ittemp1 = vt.begin();  //临时迭代器用于存储最小元素的位置
		for (it = vt.begin(); it != vt.end(); ++it)
		{
			if ((*it)->data < secondminWeight->data)
			{
				secondminWeight = *it;
				ittemp1 = it;
			}
		}
		//找到了第二小的后删除
		vt.erase(ittemp1);

		//进行合并操作
		/*
		new一个节点作为他们的根节点 删除的这两棵树分别作为它的左右子树
		*/
		TreeNode* combine = new TreeNode;

		combine->data = minWeight->data + secondminWeight->data;
		combine->leftChild = minWeight; //左子树
		combine->rightChild = secondminWeight; //右子树

		//把合成的树加入到树容器中
		vt.push_back(combine);

	}
	//最后只剩下一棵树返回树容器的第一个元素
	return vt.front();
}

//前序遍历二叉树
void front(TreeNode* treeNode)
{
	if (treeNode != NULL)
	{
		cout << treeNode->data << endl;
		front(treeNode->leftChild);
		front(treeNode->rightChild);
	}

}
int main()
{
	int data[10] = { 1,2,3,4,5,6,7,8,9,10 };

	int len = sizeof(data)/sizeof(data[0]); //这个东西比较有意思

	TreeNode* huffTree = getHuffmanTree(data,len);

	//测试结果
	front(huffTree);
}

运行结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值