import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class HuffmanTree {
//创建哈夫曼树
public static void createHuffmanTree(int arr[]) {
ArrayList<Node> nodeList=new ArrayList<>();
for(int i=0;i<arr.length;i++) {
nodeList.add(new Node(arr[i]));
}
while(nodeList.size()>1) {
Collections.sort(nodeList); //将所有结点按照结点权重进行排序
Node leftChild=nodeList.get(0); //选择最小的结点作为左子树
Node rightChild=nodeList.get(1); //选择次小的结点作为右子树
Node parent=new Node(leftChild.value+rightChild.value); //将左子树的权重加上右子树的权重得到根节点的权重
parent.left=leftChild;
parent.right=rightChild;
nodeList.remove(leftChild);
nodeList.remove(rightChild);
nodeList.add(parent); //将新生成的树加入到森林中
}
Node root=nodeList.get(0); //获得最终二叉树的根节点
levelorder(root); //二叉树层次遍历
}
public static void levelorder(Node root) {
Queue<Node> queue=new LinkedList<>(); //创建队列
ArrayList<Object> list=new ArrayList<>();
int size=0;
queue.offer(root);
while(true) {
size=queue.size();
if(size==0)
break;
else {
Node node=queue.poll(); //出队
list.add(node.value);
if(node.left!=null) {
queue.offer(node.left); //左子树入队
}
if(node.right!=null){ //右子树入队
queue.offer(node.right);
}
}
}
for(Iterator<Object> iter=list.iterator();iter.hasNext();) {
System.out.print(iter.next()+" ");
}
}
public static void main(String[] args) {
int arr[]= {13,7,8,3,29,6,1};
createHuffmanTree(arr);
}
}
class Node implements Comparable<Node>{
int value; //叶子节点权重
Node left; //左子树
Node right; //右子树
public Node(int v) {
this.value=v;
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
return (this.value-o.value);
}
}
以上代码创建的是下图中的最优二叉树,遍历方式采用的是二叉树的层次遍历。
程序运行结果:
67 29 38 15 23 7 8 10 13 4 6 1 3
创建字符编码的哈夫曼树(并未进行编码和解码操作):
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
public class HuffmanTree {
//创建哈夫曼树
public static void createHuffmanTree(ArrayList<Integer> arr) {
ArrayList<Node> nodeList=new ArrayList<>();
for(int i=0;i<arr.size();i++) {
nodeList.add(new Node(arr.get(i)));
}
while(nodeList.size()>1) {
Collections.sort(nodeList); //将所有结点按照结点权重进行排序
Node leftChild=nodeList.get(0); //选择最小的结点作为左子树
Node rightChild=nodeList.get(1); //选择次小的结点作为右子树
Node parent=new Node(leftChild.value+rightChild.value); //将左子树的权重加上右子树的权重得到根节点的权重
parent.left=leftChild;
parent.right=rightChild;
nodeList.remove(leftChild);
nodeList.remove(rightChild);
nodeList.add(parent); //将新生成的树加入到森林中
}
Node root=nodeList.get(0); //获得最终二叉树的根节点
levelorder(root); //二叉树层次遍历
}
public static void levelorder(Node root) {
Queue<Node> queue=new LinkedList<>(); //创建队列
ArrayList<Object> list=new ArrayList<>();
int size=0;
queue.offer(root);
while(true) {
size=queue.size();
if(size==0)
break;
else {
Node node=queue.poll(); //出队
list.add(node.value);
if(node.left!=null) {
queue.offer(node.left); //左子树入队
}
if(node.right!=null){ //右子树入队
queue.offer(node.right);
}
}
}
for(Iterator<Object> iter=list.iterator();iter.hasNext();) {
System.out.print(iter.next()+" ");
}
}
public static void main(String[] args) {
ArrayList<Integer> arr=new ArrayList<>();
Scanner input = new Scanner(System.in);
System.out.println("Please enter a text string:");
String words=input.nextLine();
char[] wordsArray=words.toCharArray();
HashMap<Character,Integer> wordsMap=new HashMap<>();
for(int i=0;i<wordsArray.length;i++) {
int count=0;
for(int j=0;j<wordsArray.length;j++) {
if(wordsArray[i]==wordsArray[j])
count++;
}
wordsMap.put(wordsArray[i],count); //统计每个字符出现的次数
}
Set<Character> wordSet=wordsMap.keySet(); //字符集合
for(Iterator iter=wordSet.iterator();iter.hasNext();) {
arr.add(wordsMap.get(iter.next())); //获取字符出现的次数
}
System.out.println("Results of character statistics:");
System.out.println(wordsMap);
System.out.println("Hierarchical traversal results of Huffman tree:");
createHuffmanTree(arr);
}
}
class Node implements Comparable<Node>{
int value; //叶子节点权重
Node left; //左子树
Node right; //右子树
public Node(int v) {
this.value=v;
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
return (this.value-o.value);
}
}
程序运行结果:
Please enter a text string:
ABBCCCCCCCCDDD
Results of character statistics:
{A=1, B=2, C=8, D=3}
Hierarchical traversal results of Huffman tree:
14 6 8 3 3 1 2