哈夫曼樹 九度1172

2021-07-31 00:01:05 字數 1577 閱讀 3134

題目描述:

哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。
輸入:

輸入有多組資料。

每組第一行輸入乙個數n,接著輸入n個葉節點(葉節點權值不超過100,2<=n<=1000)。

輸出:

輸出權值。
樣例輸入:

5  

1 2 2 5 9

樣例輸出:

37
這個題可以建樹也可以不建樹。

不建樹比較容易。首先要明確,題目要求輸出的乘積之和,其實就是哈夫曼樹中去除葉節點之外,其他節點的值的和。比如

題目要求意思是 1*4+2*4+2*3+5*2+9*1=37

其實可以直接 3+5+10+19=37

明白了這一點,就可以直接排序,每次取陣列中最小的兩個數,然後相加,並累加,最終就得到了輸出。**如下:

#include

#include

using

namespace

std;

int main();

scanf("%d", &n);

for(int i=0; iscanf("%d", &node[i]);

}for (int i = 0; i < n - 1; i++)

printf("%d\n", result);

return

0;}

建哈夫曼樹的話,其實也是每次計算最小的兩個,然後把他們的和累加,建樹反而比較麻煩,最終的計算也是 3+5+10+19=37。**如下:

#include

using

namespace

std;

struct huffman;

int main()

for (int i = 0; i < n; i++)

for (int i = 0; i < n - 1; i++)

else

if (node[j].weight < x2 && node[j].parent == -1)

}//經過這次迴圈,找到了最小和次小

node[n + i].weight = x1 + x2; //這五行是建樹,將最小的兩個相加,增加新節點

node[n + i].lchild = m1;

node[n + i].rchild = m2;

node[m1].parent = n + i;

node[m2].parent = n + i;

result += node[n + i].weight;

}printf("%d\n", result);

return

0;}

九度 題目1172 哈夫曼樹

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 4471 解決 1889 題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行...

九度OJ1172 哈夫曼樹

題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出 輸出...

九度OJ 1172 哈夫曼樹

由於建立的哈夫曼樹不唯一,所以機試多考察哈夫曼樹的帶權路徑長度和,如此題。此問題最終轉化為利用堆模擬建樹過程,求出非葉節點的權值和 該哈夫曼樹的帶權路徑長度和 無需作出哈夫曼樹的具體結構體 收穫如下 關於哈夫曼樹 該樹非葉節點的權值和 該哈夫曼樹的帶權路徑長度和 關於堆排序 堆排序建堆o n log...