构造哈夫曼树的思路:
1、新建一个节点类
2、把数据封装成节点,放到容器中,用于建立一个森林
3、循环寻找权值最小的两个节点,用于构造新的节点
需要定义一个方法,来寻找当前节点插入到森林中的位置
获取哈夫曼编码(用于后面文件的压缩与解压缩)
二、二叉树的构造源代码:
节点类:
package MyTree;
public class Node {
//节点类、
public int data;
public Node left;
public Node right;
}
package MyTree;
import java.util.ArrayList;
public class TreeList {
public int [] values ={1,2,3,4,5,6,7,8,9};
public ArrayList list = new ArrayList();
public static void main(String[] args) {
TreeList tree = new TreeList();
Node root=tree.createTree();
System.out.println("前序遍历:");
tree.lookTree1(root);
System.out.println("中序遍历:");
tree.lookTree2(root);
System.out.println("后序遍历:");
tree.lookTree3(root);
}
public Node createTree(){
//封装成节点
for (int i = 0; i < values.length; i++) {
Node node = new Node();
node.data=values[i];
list.add(node);
}
//构造二叉树
for (int i = 0; i < list.size()/2-1; i++) {
Node node =list.get(i);
node.left=list.get(2*i+1);
node.right=list.get(2*i+2);
}
//构造最后一个父节点
Node lastNode = list.get(list.size()/2-1);
lastNode.left=list.get((list.size()/2-1)*2+1);
if(list.size()%2==1){
lastNode.right=list.get((list.size()/2-1)*2+2);
}
return list.get(0);
}
//前序遍历
public void lookTree1(Node root){
System.out.print(root.data+" ");
if(root.left!=null){
lookTree1(root.left);
}
if(root.right!=null){
lookTree1(root.right);
}
}
//中序遍历
public void lookTree2(Node root){
if(root.left!=null){
lookTree2(root.left);
}
System.out.print(root.data+" ");
if(root.right!=null){
lookTree2(root.right);
}
}
//后续遍历
public void lookTree3(Node root){
if(root.left!=null){
lookTree3(root.left);
}
if(root.right!=null){
lookTree3(root.right);
}
System.out.print(root.data+" ");
}
}
package com.bluesky.huffm;
public class HuffmNode {
//构造HuffmNode类
private int data;
private HuffmNode left;
private HuffmNode right;
//HuffmNode类构造函数
public HuffmNode(int data) {
this.data=data;
}
//封装属性
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
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;
}
}
package com.bluesky.huffm;
import java.util.LinkedList;
public class HuffmTree {
public int [] datas ={2,1,6,4,7,9,12,3};
public LinkedList list = new LinkedList();
public HuffmNode createTree() {
//按照从小到大的将数据封装成节点
for (int i = 0; i < datas.length; i++) {
HuffmNode node = new HuffmNode(datas[i]);
//得到需要插入的位置索引
int index=getIndex(node);
//将数据添加到容器中
list.add(index, node);
}
//构造哈夫曼树
while(list.size()>1){
//移除容器中的第一个节点
HuffmNode firstNode =list.removeFirst();
//容器中原来的第二个节点变成新的第一个节点
HuffmNode secondNode =list.removeFirst();
//构造父节点数据域
HuffmNode fatherNode = new HuffmNode(firstNode.getData()+secondNode.getData());
//构造父节点左子叶
fatherNode.setLeft(firstNode);
//构造父节点右子叶
fatherNode.setRight(secondNode);
//得到构造好的父节点的索引
int index=getIndex(fatherNode);
//将父节点加入森林
list.add(index, fatherNode);
}
//返回根节点
return list.getFirst();
}
//得到索引
public int getIndex(HuffmNode node) {
for (int i = 0; i < list.size(); i++) {
if(node.getData()>list.get(i).getData()){
continue;
}else {
return i;
}
}
//如果比容器中的任何一个数大,则插入最后面
return list.size();
}
//得到哈夫曼编码
public void getHuffmCode(HuffmNode root,String code) {
if(root.getLeft()!=null){
getHuffmCode(root.getLeft(),code+"0");
}
if(root.getRight()!=null){
getHuffmCode(root.getRight(),code+"1");
}
if(root.getLeft()==null && root.getRight()==null){
System.out.println(code);
}
}
}
package com.bluesky.huffm;
public class Test {
public static void main(String[] args) {
HuffmTree tree = new HuffmTree();
HuffmNode root = tree.createTree();
tree.getHuffmCode(root, "");
}
}