九度OJ1172 哈夫曼樹

2021-07-10 11:02:53 字數 1269 閱讀 2842

題目描述:

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

輸入:

輸入有多組資料。

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

輸出:

輸出權值。

樣例輸入:

5  

1 2 2 5 9

樣例輸出:

37
方法一:構建haffman tree, 然後計算葉節點的權值。
#include #include using namespace std;

struct node

;bool cmp(node *a, node *b)

node *arr[100];

int createhaffmantree(int n)

return 0;

}int counthaffmantree(node *root, int level)

else return root->e * level;

}int main()

sort(arr, arr+n, cmp);

createhaffmantree(n);

printf("%d\n",counthaffmantree(arr[n-1], 0));

return 0;

}

方法二:不建樹,每次吧排序後最小的兩個值加入權值和,將還未統計過的值和新產生的值(最小的兩個數的和)重新排序。

#include #include using namespace std;

int main()

{ freopen("in.txt","r",stdin);

int n, sum = 0;

int arr[100];

scanf("%d",&n);

for(int i=0; i

九度OJ 1172 哈夫曼樹

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

九度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...