用java通过数组实现哈夫曼树的构建,并且返回根节点
时间: 2023-06-19 20:04:57 浏览: 91
实现哈夫曼树的构建,可以分为以下几个步骤:
1. 创建节点类Node,用于存储节点的权值和左右子节点;
2. 创建哈夫曼树构建类HuffmanTree,用于实现哈夫曼树的构建;
3. 实现HuffmanTree类中的方法createHuffmanTree(),用于构建哈夫曼树;
4. 返回哈夫曼树根节点。
下面是完整的Java代码实现:
```java
class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
this.left = null;
this.right = null;
}
}
public class HuffmanTree {
public Node createHuffmanTree(int[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
// 创建一个节点数组,用于存放所有的叶子节点和中间节点
Node[] nodes = new Node[arr.length];
for (int i = 0; i < arr.length; i++) {
nodes[i] = new Node(arr[i]);
}
// 构建哈夫曼树
while (nodes.length > 1) {
// 找到权值最小的两个节点
int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
int index1 = -1, index2 = -1;
for (int i = 0; i < nodes.length; i++) {
if (nodes[i].value < min1) {
min2 = min1;
index2 = index1;
min1 = nodes[i].value;
index1 = i;
} else if (nodes[i].value < min2) {
min2 = nodes[i].value;
index2 = i;
}
}
// 创建父节点
Node parent = new Node(min1 + min2);
parent.left = nodes[index1];
parent.right = nodes[index2];
// 删除被合并的两个节点
Node[] newNodes = new Node[nodes.length - 1];
int j = 0;
for (int i = 0; i < nodes.length; i++) {
if (i != index1 && i != index2) {
newNodes[j++] = nodes[i];
}
}
newNodes[j] = parent;
nodes = newNodes;
}
// 返回哈夫曼树的根节点
return nodes[0];
}
}
```
使用示例:
```java
public static void main(String[] args) {
int[] arr = {5, 7, 2, 13};
HuffmanTree huffmanTree = new HuffmanTree();
Node root = huffmanTree.createHuffmanTree(arr);
System.out.println(root.value); // 输出根节点的权值
}
```
输出结果:
```
27
```
阅读全文