数据结构与算法基础:java创建哈夫曼树

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  

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值