原理参考http://blog.csdn.net/shuangde800/article/details/7341289,具体实现自己试了一下
package Hafuman;
import java.util.ArrayList;
import java.util.List;
//哈夫曼树原理
//http://blog.csdn.net/shuangde800/article/details/7341289
public class TreeNode {
int id;
String nodeVaule;
double weight;
TreeNode leftNode;
TreeNode rightNode;
TreeNode parentNode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNodeVaule() {
return nodeVaule;
}
public void setNodeVaule(String nodeVaule) {
this.nodeVaule = nodeVaule;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public TreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
public TreeNode getParentNode() {
return parentNode;
}
public void setParentNode(TreeNode parentNode) {
this.parentNode = parentNode;
}
public static int getSelfId() {
return selfId;
}
public static void setSelfId(int selfId) {
TreeNode.selfId = selfId;
}
static int selfId = 0;
//建立一个哈夫曼树
public TreeNode creatTree(List<List<String>>dataList){
//创建一个森林
List<TreeNode> dataNodes = new ArrayList();
for(int i = 0;i<dataList.size();i++){
List temp = dataList.get(i);
TreeNode tempNode = new TreeNode();
tempNode.setId(++selfId);
tempNode.setNodeVaule((String) temp.get(0));
tempNode.setWeight(Double.valueOf((String) temp.get(1)));
tempNode.setLeftNode(new TreeNode());
tempNode.setRightNode(new TreeNode());
dataNodes.add(tempNode);
}
//for(int i = 0;i<3;i++){
while(dataNodes.size()>1){
dataNodes=creatNew(dataNodes);
}
TreeNode tree = dataNodes.get(0);
return tree;
}
public List<TreeNode> creatNew(List<TreeNode> dataNodes){
int FirstIndex = selectmin(dataNodes);
TreeNode First = dataNodes.get(FirstIndex);
dataNodes.remove(FirstIndex);
int SecondIndex = selectmin(dataNodes);
TreeNode Second = dataNodes.get(SecondIndex);
dataNodes.remove(SecondIndex);
TreeNode newNode = new TreeNode();
newNode.setLeftNode(First);
newNode.setRightNode(Second);
First.setParentNode(newNode);
Second.setParentNode(newNode);
newNode.setWeight(First.getWeight()+Second.getWeight());
newNode.setId(++selfId);
dataNodes.add(newNode);
return dataNodes;
}
private int selectmin(List<TreeNode> dataNodes) {
double min = dataNodes.get(0).getWeight();
int minIndex = 0;
for(int i = 1;i<dataNodes.size();i++){
if(min>dataNodes.get(i).getWeight()){
min = dataNodes.get(i).getWeight();
minIndex = i;
}
}
return minIndex;
}
//哈夫曼编码
public void traverse(){
if(this.getNodeVaule()!=null){
List codethis = Code(this);
System.out.print(this.getNodeVaule()+": ");
for(int i = 0;i<codethis.size();i++){
System.out.print(codethis.get(codethis.size()-i-1));
}
System.out.println();
}
if(this.getRightNode()==null){
return;
}else{
this.getRightNode().traverse();
}
if(this.getLeftNode()==null){
return;
}else{
this.getLeftNode().traverse();
}
}
//对于一个确定有值得node的编码
public List Code(TreeNode node){
List codeList = new ArrayList();
if(node.getParentNode()!=null){
TreeNode parent = node.getParentNode();
if(parent.getLeftNode().getId()==node.getId()){
codeList.add(0);
codeList.addAll(Code(parent));
return codeList;
}else{
codeList.add(1);
codeList.addAll(Code(parent));
return codeList;
}
}else{
return codeList;
}
}
}
package Hafuman;
import java.util.ArrayList;
import java.util.List;
public class testClass {
public static void main(String[] args) {
String [][]data ={{"a","1"},{"b","5"},{"c","10"},{"d","8"},{"u","3"},{"p","11"}};
List<List<String>>dataList = new ArrayList();
for(int i = 0;i<data.length;i++){
List temp = new ArrayList();
for(int j = 0;j<data[i].length;j++){
temp.add(data[i][j]);
}
dataList.add(temp);
}
TreeNode t = new TreeNode();
t=t.creatTree(dataList);
t.traverse();
}
}