数据结构与算法-树-哈夫曼树

哈夫曼树是一种最优二叉树,用于实现带权路径长度最小。树中权值较大的节点更接近根节点,仅包含叶子节点和度为2的节点。构建过程包括将权值视为初始树并不断合并最小权值树,直至只剩一棵树。哈夫曼树的带权路径长度公式为所有叶子节点的权值与深度-1乘积之和。
摘要由CSDN通过智能技术生成

数据结构与算法-树-哈夫曼树

概述
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
特性

  • 对于同一组权值,所能得到的赫夫曼树不一定是唯一的。
  • 赫夫曼树的左右子树可以互换,因为这并不影响树的带权路径长度。
  • 带权值的节点都是叶子节点,不带权值的节点都是某棵子二叉树的根节点。
  • 权值越大的节点越靠近赫夫曼树的根节点,权值越小的节点越远离赫夫曼树的根节点。
  • 赫夫曼树中只有叶子节点和度为2的节点,没有度为1的节点。一棵有n个叶子节点的赫夫曼树共有2n-1个节点。

Huffman Tree的构建
赫夫曼树的构建步骤如下:

  1. 将给定的n个权值看做n棵只有根节点(无左右孩子)的二叉树,组成一个集合HT,每棵树的权值为该节点的权值。
  2. 从集合HT中选出2棵权值最小的二叉树,组成一棵新的二叉树,其权值为这2棵二叉树的权值之和。
  3. 将步骤2中选出的2棵二叉树从集合HT中删去,同时将步骤2中新得到的二叉树加入到集合HT中。
  4. 重复步骤2和步骤3,直到集合HT中只含一棵树,这棵树便是赫夫曼树。

创建
图解
https://mp.weixin.qq.com/s/nx0OovSwYTeF8ebmzi_-VA

实现代码

class TreeNode{
   
  public int val;
  public TreeNode left;
  public TreeNode right;
  
  public TreeNode(int val) {
   
   this.val=val;
  }
 }
 protected TreeNode root;
 /**
 *vals 是升序序列
 */
public void create(List<Integer> vals) {
   
  Queue<Integer> q1 = new LinkedList<>(vals
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值