用JAVA实现从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
时间: 2023-11-03 16:05:39 浏览: 104
好的,我可以为您提供一个实现哈夫曼树的Java程序。以下是代码:
```java
import java.util.*;
class Node implements Comparable<Node> {
char ch; // 存储字符
int freq; // 存储字符的出现频率
Node left, right; // 左右子节点
public Node(char ch, int freq) {
this.ch = ch;
this.freq = freq;
left = null;
right = null;
}
// 比较节点的频率
public int compareTo(Node n) {
return this.freq - n.freq;
}
}
public class HuffmanTree {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
char[] chars = new char[n];
int[] freq = new int[n];
// 读入字符和权值
for (int i = 0; i < n; i++) {
chars[i] = sc.next().charAt(0);
freq[i] = sc.nextInt();
}
// 构建哈夫曼树
Node root = buildHuffmanTree(chars, freq);
// 打印哈夫曼编码
printHuffmanCode(root, "");
}
// 构建哈夫曼树
public static Node buildHuffmanTree(char[] chars, int[] freq) {
PriorityQueue<Node> pq = new PriorityQueue<>();
// 将所有节点加入优先队列中
for (int i = 0; i < chars.length; i++) {
pq.add(new Node(chars[i], freq[i]));
}
// 不断取出频率最小的两个节点合并,直到队列中只剩一个节点
while (pq.size() > 1) {
Node left = pq.poll();
Node right = pq.poll();
Node parent = new Node('\0', left.freq + right.freq);
parent.left = left;
parent.right = right;
pq.add(parent);
}
// 返回根节点
return pq.poll();
}
// 打印哈夫曼编码
public static void printHuffmanCode(Node root, String code) {
if (root.left == null && root.right == null) {
System.out.println(root.ch + " " + code);
return;
}
printHuffmanCode(root.left, code + "0");
printHuffmanCode(root.right, code + "1");
}
}
```
使用时,先输入字符集大小n,然后输入n个字符和n个权值。程序会输出每个字符对应的哈夫曼编码。注意,输入的字符和权值必须按照从小到大的顺序排列。
阅读全文