哈夫曼树

来源:互联网 发布:f22到底有多先进知乎 编辑:程序博客网 时间:2024/06/10 09:11

哈夫曼树

路径长度:

节点路径长度:从一个节点(根节点)到另外一个节点所经过的路径的分支数目

树的路径长度:指树种所有节点的路径长度之和

权值:

指的是所有叶子节点的date域,存放一个数值,用来表示当前叶子节点的数据,那这个值就是权值

带权路径长度:

所有叶子节点的带权路径长度之和

最优二叉树:

1、通过所有权值节点,形成一个二叉树,最终这个二叉树的带权路径最小,则此二叉树是哈夫曼树(最优二叉树)

2、树的结构不止一个,同一层的节点,可以左右替换

构造最优二叉树:

1、新建一个节点类

2把数据封装成节点,放到容器中,用于建立一个森林

3循环寻找权值最小的两个节点,用于构造新的节点

需要定义一个方法,来寻找当前节点插入到森林中的位置


哈夫曼树代码实现:


//****************************************************************************************//
public class HuffmNode {
private int date;
private HuffmNode left;
private HuffmNode right;

public HuffmNode(int date) {
this.date = date;
}

public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
public HuffmNode getLeft() {
return left;
}
public void setLeft(HuffmNode left) {
this.left = left;
}
public HuffmNode getRight() {
return right;
}
public void setRight(HuffmNode right) {
this.right = right;
}
}

//*********************************************************************************//

import java.util.LinkedList;


public class HuffmTree {
int[] dates = {2,1,7,6,9,4,3};
//用队列实现节点的封装
LinkedList<HuffmNode> nodeList = new LinkedList<HuffmNode>();
public HuffmNode createTree(){
//把数据封装成节点,放到容器中,用于建立一个森林
for (int i = 0; i < dates.length; i++) {
HuffmNode node = new HuffmNode(dates[i]);
//获取当前节点需要插入的位置
int index = getIndex(node.getDate());
//插入节点方式实现
nodeList.add(index,node);
}
//循环寻找权值最小的两个节点,用于构造新的节点
while(nodeList.size()>1){
HuffmNode firstNode = nodeList.removeFirst();
HuffmNode secondNode = nodeList.removeFirst();
//构造一个新的节点
HuffmNode fatherNode = new HuffmNode(firstNode.getDate()+secondNode.getDate());
fatherNode.setLeft(firstNode);
fatherNode.setRight(secondNode);
//获取当前父节点值在容器中的大小位置
int index = getIndex(fatherNode.getDate());
//把父节点放置到森林中
nodeList.add(index,fatherNode);
}
return nodeList.getFirst();
}

public int getIndex(int value){
//遍历容器
for (int i = 0; i < nodeList.size(); i++) {
HuffmNode node = nodeList.get(i);
//比较大小
if(value>node.getDate()){
continue;
}else{
return i;
}
}
return nodeList.size();
}

public void getCode(HuffmNode root,String code){
if(root.getLeft()!=null){
getCode(root.getLeft(),code+"0");
}
if(root.getRight()!=null){
getCode(root.getRight(),code+"1");
}
//判断当前节点是否为叶子节点
if(root.getLeft()==null&&root.getRight()==null){
System.out.println(code);
}
}
}






0 0