把实验结果截图上传到云班课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);