节点上的值就是权值。
构建一个赫夫曼树的核心就是需要将权值大的值,接近根节点,介绍路径。
说白了就是影响力大的地方军阀,一定要防放在自己身边,不能让这些人远离自己搞小动作,不然不知道他们背着自己搞什么小动作。
构建霍夫曼树,先进行排序。然后取出最小值,去建立一个二叉树,这个二叉树的根节点就是两个叶子节点的值得和。
然后再拿一个比较小的节点出来,和已经做好的树进行组合,再次捣鼓出来一个树。
然后根据合并之后根节点,去比较,然后创造新的二叉树
说白了就是,每次取出来最小的两个值,做成一个二叉树,新的二叉树的根节点,去和没被处理的节点进行排序,
比如 2,5,6,11,15
2,4,组成一个二叉树,根节点是7
那么这回轮到
7,6,11,15四个进行排序了
6,7,11,15
排序后,是6,7两个值组成一个二叉树
根节点13,13去和剩下的11,15进行排序,排序后
再次重复上面步骤
就是这么一个东西。
package org.example.sort;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MergeSort {
private static List<Integer> list = new ArrayList<>();//用来存储所有重复的数字,的下标
public static void main(String[] args) {
int[] arr = {1,6,2,334,66,11,3};
//将所有数据都整编成为节点
List<HeroNode> list = new ArrayList<>();
for(int ar : arr){
HeroNode heroNode = new HeroNode();
heroNode.setNo(ar);
list.add(heroNode);
}
//将所有
Collections.sort(list);//在链表里,所有Node都实现了comporbale接口,所以可以进行排序
for(HeroNode node : list){
System.out.println(node);
}
//霍夫曼树,在List中排序好节点,然后每次拿出来前两个节点,然后组成一棵树,再把这棵树根节点存进List中去
//然后排序,排序后,再拿出来两个最小节点//也就是前两个,然后组成一棵树,再存一下树
//别忘了,两个节点组成树之后,将这两个节点删除
while(list.size() > 1){
//当里面有很多个节点时候
//循环终止条件是里面只有一个节点了
HeroNode heroNode = list.get(0);
HeroNode heroNode1 = list.get(1);//取出最小的两个
HeroNode newNode = new HeroNode(heroNode1.no + heroNode.no, heroNode1, heroNode);
list.add(newNode);
list.remove(heroNode);
list.remove(heroNode1);//移除
Collections.sort(list);//重新排序
}
}
}
创建赫夫曼树的代码。
package org.example.sort;
public class HeroNode implements Comparable<HeroNode> {
//实现这个接口之后,可以按照你想要方式进行排序
public int no;
public HeroNode left;
public HeroNode right;
public HeroNode(int no, HeroNode left, HeroNode right) {
this.no = no;
this.left = left;
this.right = right;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public HeroNode getLeft() {
return left;
}
public void setLeft(HeroNode left) {
this.left = left;
}
public HeroNode getRight() {
return right;
}
public void setRight(HeroNode right) {
this.right = right;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", left=" + left +
", right=" + right +
'}';
}
public HeroNode() {
}
@Override
public int compareTo(HeroNode o) {
//让No以你想要方式进行排序
return this.no - o.no;
}
}