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;
}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容