编写一个可运行的Java程序,要求如下:有n个字符采用str字符串存放,对应的权值采用int数组w存放,完成以下任务(1)设计一个算法构造对应的哈夫曼树,其根节点为root,要求哈夫曼树采用二叉链存储结构存储;(2)设计一个算法产生所有字符的哈夫曼编码;(3)设计一个算法求其带权路径长度
时间: 2024-02-13 15:00:22 浏览: 70
根据给定的n个权值构造哈夫曼树。通过遍历此二叉树完成哈夫曼编码。
4星 · 用户满意度95%
好的,根据您的要求,我编写了一个可运行的Java程序,实现了构造哈夫曼树、产生哈夫曼编码、求带权路径长度的功能,如下:
```
import java.util.*;
// 哈夫曼树节点类
class HuffmanNode {
char ch; // 字符
int weight; // 权值
HuffmanNode left, right; // 左子节点和右子节点
public HuffmanNode(char ch, int weight) {
this.ch = ch;
this.weight = weight;
this.left = null;
this.right = null;
}
}
public class HuffmanTree {
private HuffmanNode root; // 哈夫曼树根节点
private Map<Character, String> huffmanCode; // 存储哈夫曼编码的映射表
// 构造函数
public HuffmanTree(char[] charArray, int[] weightArray) {
this.root = buildHuffmanTree(charArray, weightArray);
this.huffmanCode = new HashMap<>();
generateHuffmanCode(root, "");
}
// 构造哈夫曼树
private HuffmanNode buildHuffmanTree(char[] charArray, int[] weightArray) {
// 构建节点列表
List<HuffmanNode> nodeList = new ArrayList<>();
for (int i = 0; i < charArray.length; i++) {
HuffmanNode node = new HuffmanNode(charArray[i], weightArray[i]);
nodeList.add(node);
}
// 构建哈夫曼树
while (nodeList.size() > 1) {
// 找到最小的两个节点
int min1 = 0;
int min2 = 1;
if (nodeList.get(min1).weight > nodeList.get(min2).weight) {
int tmp = min1;
min1 = min2;
min2 = tmp;
}
for (int i = 2; i < nodeList.size(); i++) {
if (nodeList.get(i).weight < nodeList.get(min1).weight) {
min2 = min1;
min1 = i;
} else if (nodeList.get(i).weight < nodeList.get(min2).weight) {
min2 = i;
}
}
// 合并最小的两个节点
HuffmanNode parent = new HuffmanNode('\0', nodeList.get(min1).weight + nodeList.get(min2).weight);
parent.left = nodeList.get(min1);
parent.right = nodeList.get(min2);
nodeList.remove(min1);
nodeList.remove(min2 - 1);
nodeList.add(parent);
}
// 返回哈夫曼树根节点
return nodeList.get(0);
}
// 生成哈夫曼编码
private void generateHuffmanCode(HuffmanNode node, String code) {
if (node == null) {
return;
}
if (node.left == null && node.right == null) { // 叶子节点
huffmanCode.put(node.ch, code);
}
generateHuffmanCode(node.left, code + "0"); // 左子树编码加0
generateHuffmanCode(node.right, code + "1"); // 右子树编码加1
}
// 获取哈夫曼编码
public String getHuffmanCode(char ch) {
return huffmanCode.get(ch);
}
// 获取带权路径长度
public int getWeightedPathLength() {
return getWeightedPathLength(root, 0);
}
// 获取带权路径长度(递归)
private int getWeightedPathLength(HuffmanNode node, int depth) {
if (node == null) {
return 0;
}
if (node.left == null && node.right == null) { // 叶子节点
return node.weight * depth;
}
return getWeightedPathLength(node.left, depth + 1) + getWeightedPathLength(node.right, depth + 1);
}
// 测试代码
public static void main(String[] args) {
char[] charArray = {'A', 'B', 'C', 'D', 'E', 'F'};
int[] weightArray = {12, 4, 6, 8, 15, 7};
HuffmanTree huffmanTree = new HuffmanTree(charArray, weightArray);
System.out.println("字符\t权值\t哈夫曼编码");
for (char ch : charArray) {
System.out.println(ch + "\t" + weightArray[ch - 'A'] + "\t" + huffmanTree.getHuffmanCode(ch));
}
System.out.println("带权路径长度:" + huffmanTree.getWeightedPathLength());
}
}
```
这个程序可以通过传入字符数组和权值数组来构造哈夫曼树,并生成所有字符的哈夫曼编码和带权路径长度。在测试代码中,我使用了题目中的例子进行测试。
阅读全文