总体流程如下:
1.获取一个无序的数组
2.将数组放入一个容器中
3.然后将容器排序成一个有序的数组
4.然后再从有序的数组中取出 第一个 和 第二个 元素分别为左节点和右结点 进行相加的操作得到父节点
5.然后父节点将左节点和右结点进行关联
6.再从数组中删除第一个元素和 第二个元素,同时将计算得到的父节点放入数组中
7.将得到的数组进行再一次的排序,得到一个新的有序数组
代码如下:
package com.mute.tree;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 构建哈夫曼树
* @author Administrator
*
*/
public class HuffmanTree {
public static void main(String[] args) {
int arr[] = {13,7,8,3,29,6,1};
Node root = createHuffmanTree(arr);
//采用前序遍历哈夫曼树
preOrder(root);
}
/**
* 编写一个前序遍历的方法
* @param arr
* @return
*/
public static void preOrder(Node root) {
if (root != null) {
root.preOrder();
}else {
System.out.println("该树是空树,不能进行遍历操作!");
}
}
//创建huffman树的方法
public static Node createHuffmanTree(int[] arr) {
/*
*1.遍历数组
*2.将数组中的元素放入集合中
*/
List<Node> nodes = new ArrayList<Node>();
for (int value : arr) {
nodes.add(new Node(value));
}
while(nodes.size() > 1) {
//对容器中的数组进行排序的操作。
Collections.sort(nodes);
System.out.println("nodes = "+ nodes);
//取出权值最小的两个数
Node leftNode = nodes.get(0);
Node rightNode = nodes.get(1);
//根据两个数构造最父节点
Node parentNode = new Node(leftNode.value + rightNode.value);
parentNode.leftNode = leftNode;
parentNode.rightNode = rightNode;
//移除两个结点,然后将父节点放入数组中
nodes.remove(leftNode);
nodes.remove(rightNode);
nodes.add(parentNode);
Collections.sort(nodes);
System.out.println("第一次处理后:"+ nodes);
}
return nodes.get(0);
}
}
class Node implements Comparable<Node>{
int value;
Node leftNode;
Node rightNode;
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node [value=" + value + "]";
}
@Override
public int compareTo(Node o) {
//这样就是从小到大的排序
return this.value - o.value;
}
/**
* 采用前序遍历哈夫曼树
*/
public void preOrder() {
System.out.println(this);
if (this.leftNode != null) {
leftNode.preOrder();
}
if (this.rightNode != null) {
rightNode.preOrder();
}
}
}