代码

public class Main {
public static void main(String[] args) {
int[] arr = {9,8,7};

Node huffmanTree = createHuffmanTree(arr);
huffmanTree.preList(huffmanTree);
// List<Node> nodeList = new ArrayList<Node>();
// for (int i = 0;i < arr.length;i++){
// nodeList.add(new Node(arr[i]));
// }
// nodeList.remove(0);
// System.out.println(nodeList.get(0));
}

public static Node createHuffmanTree(int[] arr){
//首先 为了方便,先将arr中的每一个元素封装成一个节点,并装入集合中
List<Node> nodeList = new ArrayList<Node>();
for (int i = 0;i < arr.length;i++){
nodeList.add(new Node(arr[i]));
}

//添加完了之后 对集合中元素进行排序
Collections.sort(nodeList);
System.out.println("nodeList1:"+nodeList);
//当集合中元素大于1的时候就一直排,当等于1 的时候说明哈夫曼树创建完成
while (nodeList.size() > 1){
//首先取出两个权值最小的节点
Node leftNode = nodeList.get(0);
Node rightNode = nodeList.get(1);

//然后创建这两个节点的父节点,并与之连接
Node parent = new Node(leftNode.value + rightNode.value);
parent.left = leftNode;
parent.right = rightNode;
System.out.println("leftNode:"+leftNode);
System.out.println("rightNode:"+rightNode);
//然后把刚取出来的这两个节点删除
nodeList.remove(0);
nodeList.remove(0);

//或者用下面这两行
// nodeList.remove(leftNode);
// nodeList.remove(rightNode);
System.out.println("afterRemove:"+nodeList);
//把parent节点加进去 并重新排序
nodeList.add(parent);

Collections.sort(nodeList);
System.out.println("nodeList:"+nodeList);
}
System.out.println(nodeList);
return nodeList.get(0);
}


}

//让Node进行排序
class Node implements Comparable<Node>{
int value;
Node left;
Node right;

public Node(int value) {
this.value = value;
}

@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}

@Override
public int compareTo(Node o) {
return this.value - o.value;//从小到达排序
}
public void preList(Node root){
if (root == null){
System.out.println("为空");
return;
}else {
this.preList();
}
}
public void preList(){
System.out.println(this);
if (this.left != null){
this.left.preList();
}
if (this.right != null){
this.right.preList();
}
}

}
结果
nodeList1:[Node{value=7}, Node{value=8}, Node{value=9}]
leftNode:Node{value=7}
rightNode:Node{value=8}
afterRemove:[Node{value=9}]
nodeList:[Node{value=9}, Node{value=15}]
leftNode:Node{value=9}
rightNode:Node{value=15}
afterRemove:[]
nodeList:[Node{value=24}]
[Node{value=24}]
Node{value=24}
Node{value=9}
Node{value=15}
Node{value=7}
Node{value=8}

意外收获:​​ArrayList​​​的​​remove​

​ArrayList​​​的​​remove​​方法每调用一次,会将集合的索引值重置。比如元素为9,8,7.如果想删除9和8.可以

arrayList.remove(9);
arrayList.remove(8);

也可以

arrayList.remove(0);
arrayList.remove(0);

我们说第二种情况,为啥两次都是0,因为第一次删除之后,会将索引值重置,此时的0不再是删除了9之后指向的​​null​​,而是8.