本文共 4126 字,大约阅读时间需要 13 分钟。
以{1,3,6,7,8}为例子,构建相应的霍夫曼树
结点代码:
//创建节点类//为了让Node对象持续排序,并且具有比较的功能,继承Comparable接口class Node implements Comparable{ int val; Node left; Node right; public void preOrder(){ System.out.println(this); if (this.left != null){ this.left.preOrder(); } if(this.right != null){ this.right.preOrder(); } } 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; //当前值大于传入值, }}
调用结合类的排序方法直接排序
Collections.sort(nodes); System.out.println(nodes); //取出最小的两个 Node leftNode = nodes.get(0); Node rightNode = nodes.get(1); //构建一个新的二叉树,根节点的权值是两者之和 Node parent = new Node(leftNode.val + rightNode.val); parent.left = leftNode; parent.right = rightNode; //从ArrayList中去除已经比较过的两个最小的结点 nodes.remove(leftNode); nodes.remove(rightNode); //将新生成的二叉树的根节点加入到集合中去 nodes.add(parent); //重新排序已经修改过的节点 Collections.sort(nodes); System.out.println("排序过集合=" + nodes);
第二次:
//第二轮,取出最小的两个节点 leftNode = nodes.get(0); rightNode = nodes.get(1); //生成最小的 Node parent2 = new Node(leftNode.val + rightNode.val); parent2.left = leftNode; parent2.right = rightNode; //将原先的数组中删除已经排过序的结点 nodes.remove(leftNode); nodes.remove(rightNode); nodes.add(parent2); Collections.sort(nodes); System.out.println("第二次整理后的集合" + nodes);
总结代码:
public static Node createHuffManTree(int[] arr){ //第一步,为了操作方便,先遍历arr[]数组 //将arr【】的每一个元素,构建为Node //将Node放入ArrayList中去,便于直接排序管理 Listnodes = new ArrayList (); for (int val:arr){ //for循环的加强结构:(数组成员数据类型 数组成员名:数组名) nodes.add(new Node(val)); }// Node leftNode; Node rightNode; Node[] nodes1 = new Node[arr.length - 1]; int i = 0; Collection.sort(nodes); while (nodes.size() > 1){ leftNode = nodes.get(0); rightNode = nodes.get(1); Node parent = new Node(leftNode.val + rightNode.val); parent.left = leftNode; parent.right = rightNode; nodes.remove(leftNode); nodes.remove(rightNode); nodes.add(parent); Collections.sort(nodes); System.out.println(nodes); } //返回霍夫曼树树,就是返回root结点 nodes.get(0).preOrder(); return nodes.get(0); }
Node[] nodes1 = new Node[arr.length - 1]; int i = 0; while (nodes.size() > 1){ leftNode = nodes.get(0); rightNode = nodes.get(1); nodes1[i] = new Node(leftNode.val + rightNode.val); nodes1[i].left = leftNode; nodes1[i].right = rightNode; nodes.remove(leftNode); nodes.remove(rightNode); nodes.add(nodes1[i]); Collections.sort(nodes); System.out.println(nodes); }
left = list.get(0);list.remove(left);right = list.get(1);list.remove(right);
异常:
转载地址:http://aqgpb.baihongyu.com/