结丹期简介
结丹期主要阐述的是对哈夫曼树的思路分析与创建分析
提供完整代码,代码在筑基期中
博主空间
https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343强哥的查找算法
https://blog.csdn.net/JOElib/article/details/123848806?spm=1001.2014.3001.5501
![](https://i-blog.csdnimg.cn/blog_migrate/8bd82b1963e070d945587eb3ffbd5193.png)
目录
哈夫曼树(huffman)的创建思想😀:
- 将列表从小到大的进行排序
- 将列表中的最小权的子树(节点)取出
- 将这两个子树创建成一个新子树,新子树的根节点的权等于这两个子树的权之和
- 将新的子树放回列表中,重新进行上述操作,直到形成一个哈夫曼树
哈夫曼树的代码实现与分析🥸:
创建一个节点类
public class Node implements Comparable<Node>{
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
public String toString() {
return value + "";
}
public int compareTo(Node node) {
return value - node.value;
}
}
代码分析:
- 属性: value代表的是节点的权,left和right分别表示左子节点和右子节点
- 构造方法: 用于初始化节点
- toString方法: 方便输出节点,里面有一个字符串拼接的操作哦
- 实现Comparable接口: 由于思路中有提及需要进行排序的操作,所以节点类要实现Comparable接口,并实现compareTo方法
- compareTo方法,如果返回值是value - node.value 则表示从小到大,反之,从大到小
创建一个HuffmanTree(哈夫曼树类)
public class HuffmanTree {
}
代码分析:
略
创建一个创建哈夫曼树的方法
该方法的目的是将一个数组的数据变成一颗哈夫曼树
public static Node create(int[] array) {
var nodes = new ArrayList<Node>(array.length);
for(var item : array) {
nodes.add(new Node(item));
}
while (nodes.size() > 1) {
Collections.sort(nodes);
var left = nodes.get(0);
var right = nodes.get(1);
var parent = new Node(left.value + right.value);
parent.left = left;
parent.right = right;
nodes.remove(1);
nodes.remove(0);
nodes.add(parent);
}
return nodes.get(0);
}
代码分析:
- 我们先创建一个集合,并指定泛型为Node,构造方法中指定集合的大小,即数组的长度 array.length
- 遍历数组,用增强for循环,将数组里面的元素放入构造方法中,将new出来的节点对象放入集合中
- 没有集合的后果
- 如果没有集合,直接用数组对节点类进行排序是困难的,不方便
- 而且直接用数组进行取节点操作的时候还得考虑覆盖的情形,效率极低
- 集合的好处
- 相关工具类中有排序的方法,方便我们去调用和管理
- 我们不需要考虑底层覆盖问题,直接取出即可
- 没有集合的后果
- 根据思路,
- 先对集合进行排序,即Collection.sort(list)操作
- 再将最小的两个权的子树取出.即get(0),get(1),分别放入left和right辅助引用中
- 创建一个新节点,即新的根节点parent,其权的值等于刚取出来的权值之和
- 把新的根节点的左右节点分别于取出来的子树挂上
- 注意:由于前面两颗子树已经被取走,理论上已经不存在了,但是实际代码上没做出对应操 作时仍然存在,所以我们要调用remove()方法去删除
- 注意:一定要先删除下标为1的节点后删除下标为0的节点,否则最后一次删除会出现异常
- 最后一次第一个节点被删除,只剩下一个节点,没有下标为1的节点了
- 将新的父节点添加到集合中
- 循环执行步骤3,如果集合中只剩下最后一个元素的时候,说明哈夫曼树已经完成,可以结束循环,即list.size()>0
结论
哈夫曼树是真个压缩软件的核心部件,大家一定要学会哦