Java数据结构_12.哈夫曼树(赫夫曼树、最优二叉树) 上

一、哈夫曼树概述

哈夫曼树也叫最优二叉树,它是n个带权叶子节点构成的所有二叉树中,带权路径长度最小的二叉树。

叶节点的带权路径:从根节点出发,经过的节点的数量乘以叶子节点的权值。

树的带权路径长度WPL:树中所有叶子节点的带权路径长度之和。
在这里插入图片描述
WPL:
在这里插入图片描述
权值越大的节点离根节点越近的二叉树才是最优二叉树。

二、创建哈夫曼树流程

排序
取出根节点权值最小的两棵二叉树
组成一颗新的二叉树,前面取出来的两棵二叉树是新二叉树的两个子树
根节点的权值是前面取出来的两棵二叉树的根节点的权值之和
再重新排序…递归
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、代码创建哈夫曼树

package com.demo4;

public class Node implements Comparable<Node> {
	int value;
	Node left;
	Node right;

	public Node(int value) {
		this.value = value;
	}

	@Override
	public int compareTo(Node o) {
		return -(this.value - o.value);
	}

	@Override
	public String toString() {
		return "Node [value=" + value + "]";
	}

}

package com.demo4;

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

public class TestHuffmanTree {

	public static void main(String[] args) {
		int[] arr = { 3, 7, 8, 29, 5, 11, 23, 14 };
		Node node = createHuffmanTree(arr);
		System.out.println(node);
	}

	// 创建哈夫曼树
	public static Node createHuffmanTree(int[] arr) {
		// 使用数组中所有的元素创建若干个二叉树(只有1个节点)
		List<Node> nodes = new ArrayList<>();
		for (int value : arr) {
			nodes.add(new Node(value));
		}
		// 循环处理
		while (nodes.size() > 1) {
			// 排序
			Collections.sort(nodes);
			// 取出来权值最小的两个二叉树(从大到小排序取最后一个)
			Node left = nodes.get(nodes.size() - 1);
			// 取出来权值最小的两个二叉树(从大到小排序取最后一个)
			Node right = nodes.get(nodes.size() - 2);
			// 创建一个新二叉树
			Node parent = new Node(left.value + right.value);
			// 把取出来的两个二叉树移除
			nodes.remove(left);
			nodes.remove(right);
			// 放入原来的二叉树集合中
			nodes.add(parent);
		}
		return nodes.get(0);
	}
}

四、哈夫曼编码

定长编码

在这里插入图片描述

非定长编码

在这里插入图片描述
解码时:
在这里插入图片描述

哈夫曼编码

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值