如何用Java实现哈夫曼树
用Java实现哈夫曼树主要包括:构建节点类、计算字符频率、构建优先队列、合并节点构建哈夫曼树、生成哈夫曼编码、编码和解码功能。 其中最关键的一点是构建哈夫曼树,这涉及到优先队列的使用和节点的合并。具体来说,可以通过以下几个步骤详细实现。
一、构建节点类
- 定义节点类,包含字符、频率、左子节点和右子节点。
- 实现Comparable接口,使节点可以按频率排序。
class HuffmanNode implements Comparable<HuffmanNode> {
char c;
int frequency;
HuffmanNode left;
HuffmanNode right;
HuffmanNode(char c, int frequency) {
this.c = c;
this.frequency = frequency;
}
@Override
public int compareTo(HuffmanNode node) {
return this.frequency - node.frequency;
}
}
二、计算字符频率
- 使用HashMap存储每个字符及其出现频率。
public Map<Character, Integer> calculateFrequency(String text) {
Map<Character, Integer> frequencyMap = new HashMap<>();
for (char c : text.toCharArray()) {
frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
}
return frequencyMap;
}
三、构建优先队列
- 根据频率构建优先队列(最小堆)。
public PriorityQueue<HuffmanNode> buildPriorityQueue(Map<Character, Integer> frequencyMap) {
PriorityQueue<HuffmanNode> pq = new PriorityQueue<>();
for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
pq.add(new HuffmanNode(entry.getKey(), entry.getValue()));
}
return pq;
}
四、合并节点构建哈夫曼树
- 从优先队列中取出两个最小频率的节点,合并成新节点,并重新插入优先队列,直至队列中只剩一个节点。
public HuffmanNode buildHuffmanTree(PriorityQueue<HuffmanNode> pq) {
while (pq.size() > 1) {
HuffmanNode left = pq.poll();
HuffmanNode right = pq.poll();
HuffmanNode parent = new HuffmanNode('