-
题目描述:
-
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
-
输入:
-
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
-
输出:
-
输出权值。
-
样例输入:
5
1 2 2 5 9
样例输出:
37
说明:
1.利用java中的PriorityQueue数据结构,优先队列的作用是能保证每次取出的元素都是队列中权值最小的。java中PriorityQueue为小顶堆,(任意一个非叶子节点的权值,都不大于其左右子节点的权值)。
3.给定n个结点和他们的权值,以他们为叶子结点构造一棵带权路径长度和最小的树,即为哈夫曼树
,同时也被称为最优树
。
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int node_number = scanner.nextInt();
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(node_number);
for (int i=0;i<node_number;i++){
int leaf_node_weight = scanner.nextInt();
priorityQueue.add(leaf_node_weight);
}
int sum=0;
while (priorityQueue.size()>1){
int first_node_weight = priorityQueue.remove();//remove()返回堆顶元素并删除,将堆重新调整排序
int second_node_weight = priorityQueue.remove();
int new_sum_weight = first_node_weight+second_node_weight;
priorityQueue.add(new_sum_weight);//将元素加入堆后将堆重新排序
sum+=new_sum_weight;
}
System.out.println(sum);
}
}
}