把實驗結果截圖上傳到雲班課html
樹的帶權路經長度:每一個葉子結點到根的路徑長度權值之和,記做WPL。node
仍是汽車的例子,汽車到達天津有2條路 能夠走。第一條路通過3個站,每一個站相距13km。第二條有2個站,每一個站相距18km。那麼有距離的路咱們叫作帶權路徑。根結點爲天津的樹,那麼第一條路帶權路徑爲 3*13 = 39,第二條爲2*18。樹的帶權路徑WPL 313+218.算法
public class HuffmanTreeNode implements Comparable<HuffmanTreeNode>{ private int weight;//結點所帶的權重,通常爲機率的大小 private HuffmanTreeNode parent;//父結點 private HuffmanTreeNode left;//左子結點 private HuffmanTreeNode right;//右子節點 private char element;//元素值 } //CompareTo 方法 用於比較結點之間的權重weight @Override public int compareTo(HuffmanTreeNode huffmanTreeNode) { if (this.weight>huffmanTreeNode.weight) return 1; else{ if (this.weight<huffmanTreeNode.weight) return -1; else return 0; } }
private HuffmanTreeNode mRoot; // 根結點 private String[] codes = new String[26];
/** * 構造哈夫曼樹的方法 * @param array 一個數組,裏面的數據是元素對應的權值 */ public HuffmanTree(HuffmanTreeNode[] array) { HuffmanTreeNode parent = null; ArrayHeap<HuffmanTreeNode> heap = new ArrayHeap(); for (int i=0;i<array.length;i++) { heap.addElement(array[i]); } for(int i=0; i<array.length-1; i++) { //去除最小的兩個元素生成一棵樹 HuffmanTreeNode left = heap.removeMin(); HuffmanTreeNode right = heap.removeMin(); parent = new HuffmanTreeNode(left.getWeight()+right.getWeight(),' ',null,left,right); left.setParent(parent); right.setParent(parent); heap.addElement(parent); } mRoot = parent; }
protected void inOrder( HuffmanTreeNode node, ArrayList<HuffmanTreeNode> tempList) { if (node != null) { inOrder(node.getLeft(), tempList); if (node.getElement()!=' ') tempList.add(node); inOrder(node.getRight(), tempList); } }
public String[] getEncoding() { ArrayList<HuffmanTreeNode> arrayList = new ArrayList(); inOrder(mRoot,arrayList); for (int i=0;i<arrayList.size();i++) { HuffmanTreeNode node = arrayList.get(i); String result =""; int x = node.getElement()-'a'; Stack stack = new Stack(); while (node!=mRoot) { if (node==node.getParent().getLeft()) stack.push(0); if (node==node.getParent().getRight()) stack.push(1); node=node.getParent(); } while (!stack.isEmpty()) { result +=stack.pop(); } codes[x] = result; } return codes; }
for (int i = 0; i < s1.length(); i++) { if (s1.charAt(i) == '0') { if (huffmanTreeNode.getLeft() != null) { huffmanTreeNode = huffmanTreeNode.getLeft(); } } else { if (s1.charAt(i) == '1') { if (huffmanTreeNode.getRight() != null) { huffmanTreeNode = huffmanTreeNode.getRight(); } } } if (huffmanTreeNode.getLeft() == null && huffmanTreeNode.getRight() == null) { result2 += huffmanTreeNode.getElement(); huffmanTreeNode = huffmanTree.getmRoot(); } }
File file2 = new File("F:\\HuffmanCode2.txt"); FileWriter fileWriter1 = new FileWriter(file1); fileWriter1.write(result2);