学习数据结构和算法的日常Demo
赫夫曼树基本介绍
赫夫曼树中的重要概念
赫夫曼树构建步骤
图解
列表:4,6,7,8,13,29
列表:7,8,10,13,29
列表:10,13,15,29
列表:15,23,29
列表:29,38
列表:67
代码实现
// Node需要排序
public class HuffmanNode implements Comparable<HuffmanNode> {
int value; // 权值
HuffmanNode left; // 左子节点
HuffmanNode right; // 右子节点
public HuffmanNode(int value) {
this.value = value;
}
@Override
public String toString() {
return "HuffmanNode{" +
"value=" + value +
'}';
}
@Override
public int compareTo(HuffmanNode o) {
// 从小到大排
return this.value - o.value;
}
// 前序遍历
public void preOrder() {
System.out.print(this.value + " ");
if (this.left != null) {
this.left.preOrder();
}
if (this.right != null) {
this.right.preOrder();
}
}
}
public class HuffmanTreeDemo {
public static void main(String args[]) {
int arr[] = {13, 7, 8, 3, 29, 6, 1};
HuffmanNode root = createHuffmanTree(arr);
System.out.println("前序遍历:");
root.preOrder();
}
public static HuffmanNode createHuffmanTree(int[] arr) {
ArrayList<HuffmanNode> nodes = new ArrayList<>();
for (int i : arr) {
// 每个节点放入集合中
nodes.add(new HuffmanNode(i));
}
// 以下六步骤应为循环
while (nodes.size() > 1) {
// 0.根据权值进行排序
Collections.sort(nodes);
// 1.取出根节点权值最小的二叉树
// 单个节点视为小型二叉树
HuffmanNode leftNode = nodes.get(0);
// 2.取出第二小的节点
HuffmanNode rightNode = nodes.get(1);
// 3.构建新的二叉树
// 新二叉树权值 = 左 + 右
HuffmanNode parent = new HuffmanNode(leftNode.value + rightNode.value);
parent.left = leftNode;
parent.right = rightNode;
// 4.构建新二叉树后,删除掉用过的左右小树
nodes.remove(leftNode);
nodes.remove(rightNode);
// 5.将新树加入进集合
nodes.add(parent);
}
// 返回赫夫曼树的头结点
return nodes.get(0);
}
}