題目描述
哈夫曼樹,第一行輸入乙個數 n,表示葉結點的個數。需要用這些葉結點生 成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即 weight,題目需要輸出 所有結點的值與權值的乘積之和。
1)將所有結點放入集合 k。
2)若集合 k 中剩餘結點大於 2 個,則取出其中權值最小的兩個結點, 構造他 們同時為某個新節點的左右兒子,該新節點是他們共同的雙親結點,設定它的權 值為其兩個兒子結點的權值和。並將該父親結點放入集合 k。重複步驟 2 或 3。
3)若集合 k 中僅剩餘乙個結點, 該結點即為構造出的哈夫曼樹數的根結點, 所有構造得到的中間結點 (即哈夫曼樹上非葉子結點 )的權值和即為該哈夫曼樹 的帶權路徑和。 為了方便快捷高效率的求得集合 k 中權值最小的兩個元素,我們需要使用堆數 據結構。它可以以 o(logn)的複雜度取得 n 個元素中的最小元素。為了繞過對 堆的實現,我們使用標準模板庫中的相應的標準模板 ——優先佇列。
priority_queue<
int> q;
建立乙個儲存元素為 int 的堆 q,但是請特別注意這樣建立的堆其預設為大 頂堆,即我們從堆頂取得的元素為整個堆中最大的元素。而在求哈夫曼樹中,我 們恰恰需要取得堆中最小的元素,於是我們使用如下語句定義乙個小頂堆:
priority_queue<
int, vector<
int>
, greater<
int>> q;
//建立乙個小頂堆
關於堆的有關操作如下:
q.
push
(x);
//將元素 x 放入堆 q 中。
int a = q.
top();
// 取出堆頂元素,即最小的元素儲存在 a 中。
q.pop()
;//彈出堆頂元素,取出後堆會自動調整為乙個新的小頂堆。
#include
#include
using
namespace std;
priority_queue<
int, vector<
int>
, greater<
int>> q;
//建立乙個小頂堆
intmain()
int ans =0;
//儲存答案
while
(q.size()
>1)
cout << ans;
}return0;
}
在使用了優先佇列以後,求哈夫曼樹的過程不僅時間複雜度降低許多( o (nlogn)),同時**也輕便不少,所以使用資料結構堆來輔助求解哈夫曼樹, 是求哈夫曼樹的最佳選擇。 計算機機試題 哈夫曼樹
題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出 輸出...
王道 哈夫曼樹(C )
題意 哈夫曼樹,第一行輸入乙個n,表示葉節點的個數。需要用這些葉節點生成哈夫曼樹,根據哈夫曼樹的概念,這些節點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。樣例輸入輸出 輸入1 2 2 5 9 輸出 基礎 1.在一棵樹中,從任意乙個結點到達另乙個結點的通路被稱為路徑,該路徑上所需...
王道計算機機試練習 高精度大整數隨意進製換算
將 m 進製的數 x 轉換為 n 進製的數輸出。輸入 輸入的第一行包括兩個整數 m 和 n 2 m,n 36 下面的一行輸入乙個數 x,x 是 m 進製的數,現在要求你將 m 進製的數 x 轉換成 n 進製的數輸出。輸出 輸出 x 的 n 進製表示的數。該題初看起來很像一般的進製轉換,但提示中明確告...