数据结构:真不难!树,二叉树,哈夫曼树

本文介绍了数据结构中的树基础知识,包括树的定义、基本术语和特点,深入讲解了二叉树、满二叉树和完全二叉树的概念。特别讨论了哈夫曼树(最优二叉树),解释了其构造过程和在编码问题中的应用,展示了一种优化存储空间的方法。最后,文章提到了后续将要探讨的其他类型树结构。
摘要由CSDN通过智能技术生成

写在前面

之前讲的链表,栈,队列等都是线性存储结构,都是一对一的关系。而树是具有一对多关系的数据结构。比如我们经常说的湖北省武汉市,湖南长沙的一个类图,就类似于一颗倒转的树。

img

什么是树

树是一种数据结构,由n个节点构成的具有层次关系的有限集合。
image-20210713224114989

树的基本术语

节点:树中的每一个数据元素都是节点(A,B…)

节点的度:节点的子树个数(A的子树为B和C)

树的度:树中所有节点最大的度(树A和树C的度都是2)

叶子节点:度为0的节点(D,E,F)

节点的层次:树的根开始,树根所在的层为第一层,根的子节点所在的层为第二层(A第一层,BC第二层)

有序树和无序树:子树有左右顺序之分 (如左边的小于右边),反之则为无序树

树的特点

  1. 子树是不相交的
  2. 除了根节点之外,每个节点有且只有一个父节点
  3. 一个又N个节点构成的树只有N-1条边

什么是二叉树

树中的节点的度不超过2的有序树。
image-20210713230407488
二叉树的特点:

  1. 二叉树中,第i层的节点数最多为2i-1

  2. 深度为k的二叉树最多有2k-1个节点

  3. 对于任意二叉树,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1,

    即度为0的节点n0,永远比度为2的节点 n2多一个。
    若排版问题可看图

满二叉树

二叉树中除了叶子节点,每个节点的度都为2,则此二叉树为满二叉树。

具有 n 个节点的满二叉树的深度为: log2(n+1)
image-20210714002538228

完全二叉树

一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
image-20210714003735456

哈夫曼树(最优二叉树)

若给定一个二叉树如下:
image-20210714135953216
路径:在一棵树中,一个节点到另一个节点之间的通路,称为路径。如上图中的根节点到a之间的通路。

路径长度:在一条路径中,每经过一个节点,路径长度就加1。如上图根节点到节点c的路径长度为3。

节点的权:每个节点赋予一个新的数值。如a的权为7,b的权为5。

节点的带权路劲长度:从根结点到该结点之间的路径长度与该结点的权乘积。如b的带权路径长度为2*5=10。

树的带权路径长度:树中所有叶子结点的带权路径长度之和。通常记作 “WPL” 。如图中所示的这颗树的带权路径长度为:WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3

什么是哈夫曼树

构造一棵二叉树(每个节点都是叶子结点且都有各自的权值),该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffman Tree)

编码问题

场景:给定一段字符串,包含58个字符,且由以下7个字符构成:a,b,c,d,e,f,g,这7个字符出现的频次不同,如何对这7个字符进行编码如何对字符串进行编码,可以使得该字符串的编码存储空间最少?
image-20210714141834626
如果用标准的等长ASCII编码:58 × 8 = 464位

用二叉树进行编码

若用0和1表示左右分支,取出上面4个频次最高的字符,可以得到如下一棵树:
image-20210714143322940
image-20210714150513498
由上图可知,编码为0100可表示的字符就有3种可能的情况,因此,上面节点的分布具有二义性。如何避免二义性?只需要让每个节点都是叶子节点即可。
image-20210714152035199

哈夫曼树图示构造

通过上面的方式,我们把上面的字符按频次依次两两组合,且都为叶子节点。最后构造图示如下:
image-20210714230327864
因此,我们发现每个节点都是叶子节点,字符最后的编码为:
image-20210714230617039
所以,编码长度为:

10x3 + 15x2 + 12x2 + 3x5 + 4x4 + 13x2 + 1x5 = 146位

代码构造

public class HuffmanTree {
   

    //节点
    public static class Node<E> {
   
        //数据,如a,b,c,d。。。
        E data;
        //权重
        
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值