#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);
}
运行结果