由於建立的哈夫曼樹不唯一,所以機試多考察哈夫曼樹的帶權路徑長度和,如此題。此問題最終轉化為利用堆模擬建樹過程,求出非葉節點的權值和(=該哈夫曼樹的帶權路徑長度和)。(無需作出哈夫曼樹的具體結構體)
收穫如下:
①關於哈夫曼樹:該樹非葉節點的權值和=該哈夫曼樹的帶權路徑長度和
②關於堆排序:堆排序建堆o(n*logn),初始堆完成後,每次重新調整只需o(logn)(樹深),故是效率很高的動態排序演算法,以後動態排序要想到它(具體分析見王道堆排序)
③關於堆模板:即「優先佇列」,在標頭檔案中
1.大根堆:
priority_queue《型別》 q;
2.小根堆
priority_queue《型別,vector《型別》,greater《型別》 >
//(此處「> >」必須要有空格)(小根堆或可使用該型別比較運算子過載來實現)
3.其大部分函式與stack模板一致
題目描述:哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。
輸入:輸入有多組資料。
每組第一行輸入乙個數n,接著輸入n個葉節點(葉節點權值不超過100,2<=n<=1000)。
輸出:輸出權值。
樣例輸入:
51 2 2 5 9
樣例輸出:
37
2023年北京郵電大學計算機研究生機試真題
答疑:
#include #include using namespace std;
int main()
//input
for (int i=0;i>k;
h.push(k);
}//process
for (int i=0;i
九度OJ1172 哈夫曼樹
題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出 輸出...
九度OJ 1172 哈夫曼樹
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。5 1 2 2 ...
九度OJ 1172 哈夫曼樹
九度oj 1172 哈夫曼樹 哈夫曼樹 huffman tree 給定n 個權值作為 n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,即哈夫曼樹 這題可以建樹,也可以不建樹。建樹 include include include define maxvalue 0x7...