一文带你走进赫夫曼树

146 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言:上文讲到堆排序的分析,今天带领大家温习并完成接下来的赫夫曼树学习~

赫夫曼树

  • 别名:哈夫曼树,霍夫曼树

基本介绍

  1. 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度 (wpl)达到最小,这样的二叉树为最优二叉树,也是赫夫曼树
  2. 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近

概念

  1. 路径:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路
  2. 路径长度:通路中分支的数目称为路径长度
  3. 若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1
  4. 结点的权:若将树中结点赋给一个有着某种含义的数值, 则该数值称为该结点的权
  5. 结点的带权路径长度:从根结点到该结点 之间的路径长度与该结点的权的乘积
  6. 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记 为WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树

WPL举例说明:

image-20220912090337839

思路分析

数列:{13, 7, 8, 3, 29, 6, 1} 把数列构造成一颗赫夫曼树

步骤

  1. 从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树
  2. 取出根节点权值最小的两颗二叉树
  3. 组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
  4. 再将这颗新的二叉树,以根节点的权值大小 再次排序, 不断重复 1-2-3-4 的步骤, 直到数列中,所有的数据都被处理,就得到一颗赫夫曼树

最终得到的赫夫曼树:

image-20220912094052604