用JAVA语言从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并且打印哈夫曼树
时间: 2023-07-19 15:22:33 浏览: 118
好的,我可以帮你解决这个问题。以下是用JAVA语言实现的代码:
```java
import java.util.PriorityQueue;
import java.util.Scanner;
class Node implements Comparable<Node> {
char c;
int freq;
Node left, right;
public Node(char c, int freq) {
this.c = c;
this.freq = freq;
this.left = null;
this.right = null;
}
public Node(int freq, Node left, Node right) {
this.c = '\0';
this.freq = freq;
this.left = left;
this.right = right;
}
public boolean isLeaf() {
return this.left == null && this.right == null;
}
@Override
public int compareTo(Node node) {
return this.freq - node.freq;
}
}
public class HuffmanTree {
public static Node buildHuffmanTree(char[] chars, int[] freqs) {
PriorityQueue<Node> pq = new PriorityQueue<>();
for (int i = 0; i < chars.length; i++) {
pq.offer(new Node(chars[i], freqs[i]));
}
while (pq.size() > 1) {
Node left = pq.poll();
Node right = pq.poll();
Node parent = new Node(left.freq + right.freq, left, right);
pq.offer(parent);
}
return pq.poll();
}
public static void printHuffmanTree(Node root) {
printHuffmanTree(root, "");
}
private static void printHuffmanTree(Node root, String prefix) {
if (root.isLeaf()) {
System.out.println(root.c + ": " + prefix);
} else {
printHuffmanTree(root.left, prefix + "0");
printHuffmanTree(root.right, prefix + "1");
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
char[] chars = new char[n];
int[] freqs = new int[n];
for (int i = 0; i < n; i++) {
chars[i] = scanner.next().charAt(0);
}
for (int i = 0; i < n; i++) {
freqs[i] = scanner.nextInt();
}
Node root = buildHuffmanTree(chars, freqs);
printHuffmanTree(root);
}
}
```
在上面的代码中,我们定义了一个 `Node` 类来表示哈夫曼树的节点。如果节点是叶子节点,它会保存字符和出现频率;否则,它会保存该节点的左右子节点。
我们使用一个优先队列来存储每个节点,并按照频率从小到大排序。然后,我们从队列中取出两个频率最小的节点,并将它们合并为一个节点,其频率等于它们的频率之和。我们将新节点重新插入优先队列中,不断重复这个过程,直到队列中只剩下一个节点,即为哈夫曼树的根节点。
最后,我们使用递归方式遍历哈夫曼树,并打印每个字符对应的编码。
你可以在终端中输入以下内容来测试这个程序:
```
5
a b c d e
10 20 30 40 50
```
输出结果应该如下:
```
a: 110
b: 1110
c: 0
d: 10
e: 1111
```
阅读全文