1.定义节点
package haffman;
public class Node implements Comparable<Node>{
public int val; // 权值
public Node left;
public Node right;
public Node(int val) {
this.val = val;
}
@Override
public String toString() {
return "Node{" +
"val=" + val +
'}';
}
@Override
public int compareTo(Node o) {
return this.val - o.val;
}
/**
* 前序遍历
*/
public void preList() {
System.out.println(this);
if (this.left != null) {
this.left.preList();
}
if (this.right != null) {
this.right.preList();
}
}
}
2.哈夫曼树的简单实现和测试
package haffman;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class HaffmanTree {
public static void main(String[] args) {
int[] array = {13, 7, 8, 29, 6, 1};
Node root = createHaffmanTree(array);
pre(root);
}
/**
* 转化为哈夫曼树的基本步骤为:
* 1.把数组中的数据转化为带有权值的Node结点
* 2.把结点按照权重大小进行升序排序
* 3.每次取出数组的前两个结点进行相加组成一个新的临时节点
* 4.把前两个节点分别设为临时节点的左右节点
* 5.把取出的两个节点从数组中移除,并且把临时节点添加到数组
* 6.重复2-5步骤,直到数组长度为1
* 7.返回头结点用于遍历
* @param a
* @return
*/
public static Node createHaffmanTree(int[] a) {
// 数组转化为结点
List<Node> list = new ArrayList<>();
for (int i:a) {
list.add(new Node(i));
}
while (list.size()>1) {
// 排序
Collections.sort(list);
// 查看每次数组的变化
System.out.println("排序后的数组为:" + list);
// 取出头两个节点
Node leftNode = list.get(0);
Node rightNode = list.get(1);
// 创建临时节点
Node root = new Node(leftNode.val+rightNode.val);
root.left = leftNode;
root.right = rightNode;
list.remove(leftNode);
list.remove(rightNode);
list.add(root);
}
return list.get(0);
}
/**
* 前序遍历
*/
public static void pre(Node node) {
if (node != null) {
node.preList();
}else {
System.out.println("二叉树为空");
}
}
}