赫夫曼樹的實現
阿新 • • 發佈:2022-12-05
package HuffmanTrere; import javax.swing.plaf.nimbus.NimbusLookAndFeel; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; public class HuffmanTree { public static void main(String[] args) { int arr []={13,7,8,3,29,6,1}; Node root=createHuffmanTree(arr); preOrder(root); } public static void preOrder(Node root){ if(root!=null){ root.preOrder(); } else { System.out.println("是空樹,不能遍歷"); } } public static Node createHuffmanTree(int []arr){ List<Node> nodes=new ArrayList<Node>(); for(int value :arr){ nodes.add(new Node(value)); } while (nodes.size()>1) { //排序從小到大 Collections.sort(nodes); System.out.println("nodes" + nodes); //取出權值最小的數 Node leftNode = nodes.get(0); //取出權值第二小的數 Node rightNode = nodes.get(1); //構建一顆二叉樹 Node parentNode = new Node(leftNode.value + rightNode.value); parentNode.right = rightNode; parentNode.left = leftNode; //從array中刪除處理過的二叉樹 nodes.remove(leftNode); nodes.remove(rightNode); nodes.add(parentNode); } return nodes.get(0); //返回赫爾曼夫的root根節點 } } class Node implements Comparable<Node> { int value; //結點的權值。 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 value) { this.value = value; } @Override public String toString() { return "Node [value=" + value + "]"; } @Override public int compareTo(Node o) { return this.value - o.value; //表示從小到大排序 } }