Day7:哈夫曼树(优先队列思想)

一、补充知识点

  • C++优先队列

与列队区别:可以自定义其中数据的优先级, 让优先级高的排在队列前面, 优先出队。

    priority_queue<Type, Container, Functional>
    //Type 数据类型  Container容器类型(默认vector)
    //Functional 比较方式
    
    #include <queue> 
    using namespace std;
    priority_queue <int> q; //默认大顶堆
    //小顶堆
    priority_queue <int,vector<int>,greater<int> > q;
    //大顶堆
    priority_queue <int,vector<int>,less<int> > q;
操作 语义
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头元素
swap 交换内容

二、例题

7.1 计算哈夫曼树

  • 题目描述

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

  • 输入描述

输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。

  • 输出描述

输出权值。

  • 示例输入

5
1 2 2 5 9

  • 示例输出

37

7.1代码

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    int n;
    priority_queue <int, vector<int>, greater<int> > q; //小顶堆
    while(!q.empty())
    {
        q.pop(); //清空小顶堆
    }
    while(cin >> n){
        int ans = 0;
        for(int i = 1; i <= n; i++)
        {
            int x;
            cin >> x;
            q.push(x);
        }
        while(q.size()>1) //堆中元素大于1个
        {
            //取出堆中最小的两个元素
            int a = q.top();
            q.pop();
            int b = q.top();
            q.pop();
            ans += a + b;//求和作为父结点
            q.push(a + b); //父结点放回堆中
            //这里注意ans是累加和,push的是每次a+b的值才对
        }
        cout << ans << endl;
    }
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容