以下是我用java實現數據結構中的赫夫曼樹
package com.husiwang.HuffmanTree; /** * Created by SiwangHu on 2015/2/3. */ public class HuffmanTreeNode { private String Data; //數據緩存 private int Weight; //權值 private int Parent; //父結點 private int LeftChild; //左結點 private int RightChild; //右結點 private Object[] Code; //編碼 private int Length; //編碼長度 public HuffmanTreeNode() { Data = null; Weight=0; Parent=-1; LeftChild=-1; RightChild=-1; } public HuffmanTreeNode(String data) { Data = data; Weight=0; Parent=-1; LeftChild=-1; RightChild=-1; } public HuffmanTreeNode(String data, int weight) { Data = data; Weight = weight; Parent=-1; LeftChild=-1; RightChild=-1; } public HuffmanTreeNode(int parent, int leftChild, int rightChild) { Data=null; Weight=0; Parent = parent; LeftChild = leftChild; RightChild = rightChild; } public HuffmanTreeNode(String data, int weight, int parent, int leftChild, int rightChild) { Data = data; Weight = weight; Parent = parent; LeftChild = leftChild; RightChild = rightChild; } public String getData() { return Data; } public int getWeight() { return Weight; } public int getParent(){ return Parent; } public int getLeftChild() { return LeftChild; } public int getRightChild() { return RightChild; } public String getCode() { String temp=""; for(int i=0;i<Code.length;i++){ temp+=Code[i]; } return temp; } public int getLength() { return Code.length; } public void setData(String data) { Data = data; } public void setWeight(int weight) { Weight = weight; } public void setParent(int parent) { Parent = parent; } public void setLeftChild(int leftChild) { LeftChild = leftChild; } public void setRightChild(int rightChild) { RightChild = rightChild; } public void setCode(Object[] code) { for (int i = 0; i <code.length ; i++) { Code[i]=code[i]; } } public void setCode(int i,Object data){ Code[i]=data; } public void setLength(int length) { Length=length; Code=new Object[length]; } @Override public String toString() { String temp=""; for(int i=0;i<Code.length;i++){ temp+=Code[i]; } return "HuffmanTreeNode{" + "Weight=" + Weight + ", Data='" + Data + '\'' + ", Parent=" + Parent + ", LeftChild=" + LeftChild + ", RightChild=" + RightChild + ", Code=" + temp + ", Length=" + Length + '}'; } } package com.husiwang.HuffmanTree; /** * Created by SiwangHu on 2015/2/3. */ public class HuffmanTree { private HuffmanTreeNode Node[]; //結點 private int NodeNum; //結點數目 private Object[] Temp; //臨時編碼量 public HuffmanTree(int nodeNum){ Node=new HuffmanTreeNode[2*nodeNum-1]; for(int i=0;i<2*nodeNum-1;i++){ Node[i]=new HuffmanTreeNode(); } Temp=new Object[300]; NodeNum=nodeNum; } public int getNodeNum() { return NodeNum; } public void setNodeNum(int nodeNum) { NodeNum = nodeNum; } public void setTemp(int temp) { Temp=new Object[temp]; } public int getTemp() { return Temp.length; } public void CreateHuffmanTree(String[] data,int[] weight){ if(NodeNum!=weight.length||NodeNum!=data.length) return; else{ for(int i=0;i<data.length;i++){ Node[i].setData(data[i]); Node[i].setWeight(weight[i]); } for(int i=0;i<NodeNum-1;i++){ int Max1=Integer.MAX_VALUE; int Max2=Integer.MAX_VALUE; int Temp1=0,Temp2=0; for(int j=0;j<NodeNum+i;j++){ if(Node[j].getWeight()<Max1&&(Node[j].getParent()==-1)){ Max2 = Max1; Temp2 = Temp1; Temp1 = j; Max1=Node[j].getWeight(); } else if(Node[j].getWeight()<Max2&&(Node[j].getParent()==-1)){ Max2 = Node[j].getWeight(); Temp2 = j; } } Node[Temp1].setParent(NodeNum+i); Node[Temp2].setParent(NodeNum+i); Node[NodeNum+i].setWeight(Node[Temp1].getWeight()+Node[Temp2].getWeight()); Node[NodeNum+i].setLeftChild(Temp1); Node[NodeNum+i].setRightChild(Temp2); } } } public void Coding(){ for(int i=0;i<NodeNum;i++){ int count=0,node,parent; for(node=i,parent=Node[i].getParent();parent!=-1;node=parent,parent=Node[node].getParent()){ if(Node[parent].getLeftChild()==node){ Temp[count]='0'; count++; } else{ Temp[count]='1'; count++; } } Node[i].setLength(count); for (int j = count-1,k=0; j>-1 ; j--,k++) { Node[i].setCode(k,Temp[j]); } } } public String DeCoding(char[] data){ String text=""; int root=getRoot(); for (int i = 0; i <data.length ; i++) { if(data[i]=='0') root=Node[root].getLeftChild(); if(data[i]=='1') root=Node[root].getRightChild(); if(Node[root].getLeftChild()==-1&&Node[root].getRightChild()==-1){ text+=Node[root].getData(); root=getRoot(); } } return text; } public int getRoot() { int node, parent; for (node = 0, parent = Node[node].getParent(); parent != -1; node = parent, parent = Node[node].getParent()) { } return node; } public HuffmanTreeNode Get(int Index){ if(Index<NodeNum){ return Node[Index]; } else{ throw new RuntimeException("下標過界"); } } @Override public String toString() { String temp=""; for (int i = 0; i <NodeNum ; i++) { temp+=Node[i]; } return "HuffmanTree{" + "Node=" + temp + ", NodeNum=" + NodeNum + '}'; } }