題目描述:
哈夫曼樹,第一行輸入乙個數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...