30、赫夫曼树

1. 概念

赫夫曼树: 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也叫赫夫曼树(Huffman Tree)。

路径:从一个节点往下可以达到的孩子或者孙子节点之间的通路,称之为路径。

路径长度:通路中的分支数目称之为路径长度,若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1。

:将书中的节点赋给一个有某种意义的数值,则这个数值称之为给节点的权。

带权路径长度:从根节点到该节点之间的路径长度与该节点的权的乘积。

2. 将数列转成赫夫曼树

  • 思路

1、写Node类,其中Node类需要继承Comparable类,实现其中的compareTo()方法,为的是实现Node数组的排序(java自带的排序)

2、将举例子的数组值转化为list<Node>值并排序 3、将list中最小的两个node拿出,并构成一个二叉树,将父节点的值写成左右子节点的值的和,并将父节点加入到list中去 4、重复2、3操作,直到list只有一个元素。

  • 代码
package tree;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class HuffmanTree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {2,7,4,3,1,9,8,0};
		HuffmanTree huffmanTree = new HuffmanTree();
		Node node = huffmanTree.buildHuffmanTree(arr);
	    System.out.println(node.toString());
		
		

	}
	
	//构建哈弗曼树
	public Node buildHuffmanTree(int[] arr) {
		Node pareNode;
		ArrayList<Node> list = new ArrayList<Node>();
		//1、将arr转换为list,并排序
		for (int i = 0; i < arr.length; i++) {
			list.add(new Node(arr[i]));
		}
//		Collections.sort(list);
//		System.out.println(list);
		
		while(list.size() > 1) {
			
			Collections.sort(list);
			System.out.println(list);
			//2、取出最小的两个数,进行拼接node
			
			pareNode = new Node(list.get(0).getValue()+list.get(1).getValue());
			pareNode.setLeftNode(list.get(0));
			pareNode.setRightNode(list.get(1));
			//3、list剔除lsftNode和rightNode,并加入parentNode
			list.remove(0);
			list.remove(0);
			list.add(pareNode);
		}
		
		
		
		return list.get(0);
		
	}
	
	

}






//树节点
class Node implements Comparable<Node>{
	private int value;
	private Node leftNode;
	private Node rightNode;
	public int getValue() {
		return value;
	}
	public Node(int value) {
		this.value = value;
	}
	
	
	public void setValue(int value) {
		this.value = value;
	}
	public Node getLeftNode() {
		return leftNode;
	}
	public void setLeftNode(Node leftNode) {
		this.leftNode = leftNode;
	}
	public Node getRightNode() {
		return rightNode;
	}
	public void setRightNode(Node rightNode) {
		this.rightNode = rightNode;
	}
	@Override
	public String toString() {
		return "Node [value=" + value + "]";
	}
	@Override
	public int compareTo(Node o) {
		// TODO Auto-generated method stub
		return this.value - o.getValue();//升序
	}
	
	
	
}
以下是Java中创建赫夫曼树的示例代码: ```java import java.util.*; class HuffmanNode implements Comparable<HuffmanNode> { int frequency; char character; HuffmanNode left, right; public HuffmanNode(int frequency, char character, HuffmanNode left, HuffmanNode right) { this.frequency = frequency; this.character = character; this.left = left; this.right = right; } public boolean isLeaf() { return left == null && right == null; } @Override public int compareTo(HuffmanNode o) { return this.frequency - o.frequency; } } public class HuffmanTree { private Map<Character, Integer> frequencyMap; private HuffmanNode root; public HuffmanTree(Map<Character, Integer> frequencyMap) { this.frequencyMap = frequencyMap; buildTree(); } private void buildTree() { PriorityQueue<HuffmanNode> queue = new PriorityQueue<>(); for (Character c : frequencyMap.keySet()) { queue.add(new HuffmanNode(frequencyMap.get(c), c, null, null)); } while (queue.size() > 1) { HuffmanNode left = queue.poll(); HuffmanNode right = queue.poll(); HuffmanNode parent = new HuffmanNode(left.frequency + right.frequency, '\0', left, right); queue.add(parent); } root = queue.poll(); } public Map<Character, String> getCodeTable() { Map<Character, String> codeTable = new HashMap<>(); getCodeTableHelper(codeTable, root, ""); return codeTable; } private void getCodeTableHelper(Map<Character, String> codeTable, HuffmanNode node, String code) { if (node.isLeaf()) { codeTable.put(node.character, code); return; } getCodeTableHelper(codeTable, node.left, code + "0"); getCodeTableHelper(codeTable, node.right, code + "1"); } public static void main(String[] args) { Map<Character, Integer> frequencyMap = new HashMap<>(); frequencyMap.put('A', 10); frequencyMap.put('B', 20); frequencyMap.put('C', 30); frequencyMap.put('D', 40); HuffmanTree huffmanTree = new HuffmanTree(frequencyMap); System.out.println(huffmanTree.getCodeTable()); } } ``` 在这个示例中,我们定义了一个HuffmanNode类来表示Huffman树中的节点。HuffmanNode类实现了Comparable接口,以便我们可以将节点添加到优先队列中。我们还定义了一个HuffmanTree类,该类通过给定的频率映射来构建Huffman树。构建树的过程使用优先队列进行,队列中的元素按其频率排序。我们还实现了一个辅助函数,用于生成Huffman编码表。最后,我们在main方法中使用一个简单的示例来测试我们的Huffman树实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值