优先队列的STL运用与哈夫曼树的实现

priority_queue是优先队列,简称堆,哈夫曼树的实现需要依靠于堆的操作

堆是一颗二叉树,看似队列又非队列,其具有一定的排列性,我们将从STL库中的priority_queue来进行讲解

需要使用priority_queue时候需要#include <queue> using namespace std;

创建一个优先队列的操作是priority_queue <int> q,默认是优先级高的最先进行

随后其操作有以下几种:

push(x)//在优先队列中插入数字并对其进行初始化操作(局部排序)

pop()//弹出优先队列

size() //返回堆的长度

top() //弹出优先级较高的元素


STL库中还有一个定义方式

priority_queue <int,vector<int>,greater <int> > q;

其实是将数字较低的转置为优先级高的从而实现STL库的使用

其中如果int改为char,double,float等,那么相应地vector中的元素也需要进行相应的改变


我们都直到哈夫曼树是最优二叉树的一种通俗叫法,我们利用STL库的堆的操作来对其进行代码的撰写

常用的例子有搬东西的例子

也就是说有1,2,8,10斤大米,每斤大米对应的体力值是1,如何搬运消耗的体力值最少

我们首先选取1,2,可以得到树的权为3,随后在3,8,10中选择,其中3+8<3+10<8+10,故选择3和8,得到11,随后搬运11和10,得到权数是20,体力值是其之和,同时也是消耗体力最少的方法,如下我们将给出代码

#include <iostream>
#include <queue>
using namespace std;
priority_queue <int,vector<int>,greater <int> > q;
int main()
{
int n;
int ans=0,x,y,temp;//ans代表权值
cin>>n;//输入个数
for(int i=0;i<n;i++)
{
cin>>temp;//输入权数
q.push(temp);
}
while(q.size()>1)//必须有两个元素才可以对其进行操作
{
x=q.top();
q.pop();
y=q.top();
q.pop();
q.push(x+y);
ans=x+y;
}
cout<<x+y<<endl;
return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是C++类实现哈夫曼树权值和的代码: ```c++ #include <iostream> #include <queue> #include <cstring> using namespace std; class HuffmanTree { public: HuffmanTree(int *weights, int size) { buildHuffmanTree(weights, size); } ~HuffmanTree() { deleteTree(root); } int getWeightSum() { return weightSum(root); } private: struct TreeNode { int weight; TreeNode *left, *right; TreeNode(int weight) : weight(weight), left(NULL), right(NULL) {} }; struct TreeNodeCompare { bool operator()(const TreeNode *a, const TreeNode *b) { return a->weight > b->weight; } }; TreeNode *root; void buildHuffmanTree(int *weights, int size) { priority_queue<TreeNode *, vector<TreeNode *>, TreeNodeCompare> pq; for (int i = 0; i < size; i++) { pq.push(new TreeNode(weights[i])); } while (pq.size() > 1) { TreeNode *node1 = pq.top(); pq.pop(); TreeNode *node2 = pq.top(); pq.pop(); TreeNode *node = new TreeNode(node1->weight + node2->weight); node->left = node1; node->right = node2; pq.push(node); } root = pq.top(); } void deleteTree(TreeNode *node) { if (node == NULL) { return; } deleteTree(node->left); deleteTree(node->right); delete node; } int weightSum(TreeNode *node) { if (node == NULL) { return 0; } return node->weight + weightSum(node->left) + weightSum(node->right); } }; int main() { int weights[] = {10, 15, 12, 3, 4, 13, 1}; int size = sizeof(weights) / sizeof(weights[0]); HuffmanTree tree(weights, size); cout << "Weight sum of Huffman tree: " << tree.getWeightSum() << endl; return 0; } ``` 该代码使用了C++类来实现哈夫曼树的构建和权值和的计算。在构造函数中,我们使用了STL中的优先队列来构建哈夫曼树。在析构函数中,我们使用递归的方式来释放哈夫曼树的内存。在计算权值和的函数中,我们使用递归的方式来遍历哈夫曼树,并计算所有节点的权值之和。你可以将weights数组替换为自己的数据,然后运行该代码,即可输出对应的哈夫曼树权值和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值