【数据结构-树和二叉树-森林-哈夫曼树】

devtools/2024/11/30 0:41:49/

目录

  • 1
    • 1.1 的描述(基本术语)
  • 2 >二叉的度最大为2)
    • 2.1 注意事项-五种基本形态
    • 2.2 >二叉的抽象数据类型定义
  • 3 >二叉的性质
    • 3.1 两种特殊形式的>二叉-重点会计算
    • 3.2 题目练习:
  • 4 >二叉的存储结构
    • 4.1 顺序存储结构
    • 4.2 链式存储结构
  • 5 遍历>二叉和线索>二叉
    • 5.1 一般是三种遍历顺序(先左后右)
      • 5.1.1 中序-递归法
      • 5.1.2 中序-非递归法
    • 5.2 由遍历顺序确定唯一>二叉
      • 5.2.1 题目练习
    • 5.3 线索>二叉
      • 5.3.1 遍历线索>二叉
  • 6 森林
  • 7 哈夫曼

学习笔记记录

1

 什么是?是一种非线性的结构,和子是相对的概念,例如A的子有B,C,D。但是B的子有E,F,因此相对于E,F而言,B也是一棵,即在的定义中又用到的定义,其结构定义是一种递归的定义,它道出了的固有特性,类似于下图:
在这里插入图片描述
在这里插入图片描述

1.1 的描述(基本术语)

 有了的结构,但是我们怎么描述这个呢?而且要通俗易懂,所以术语就应运而生:
在这里插入图片描述

2 >二叉的度最大为2)

   >二叉本身就是的一种,所以上面的的术语完全适用于>二叉

2.1 注意事项-五种基本形态

在这里插入图片描述

2.2 >二叉的抽象数据类型定义

 一般包三个方面:
ADT BinaryTree{
数据对象D:…
数据关系R:…
数据操作P:重点:}

3 >二叉的性质

  • >二叉的 第i层上至多有 2 i − 1 2^{i-1} 2i1个结点.
  • 深度为k的 >二叉至多有 2 k − 1 2^k-1 2k1 个结点 (k>=1).
  • 对任何一棵>二叉T, 如果其终端结点数(叶子)为n0,度为2的结点数为n2,则 n 0 = n 2 + 1 n_0 = n_2+1 n0=n2+1。(证明)

1.对于整个就是由度为0(叶子),度为1,度为2的节点组成,也就是
n = n 0 + n 1 + n 2 . n = n_0+n_1+n_2. n=n0+n1+n2.

2.而且n0节点射出0条线,n1节点射出1条线,n2 节点射出2线,则总的射出线条是:
n o u t = 0 ∗ n 0 + 1 ∗ n 1 + 2 ∗ n 2 = 1 ∗ n 1 + 2 ∗ n 2 \begin{align} n_{out} &= 0*n_0+1*n_1+2*n_2 \\ &= 1*n_1+2*n_2 \\ \end{align} nout=0n0+1n1+2n2=1n1+2n2
3.对于每个节点而言,除了根节点,每个节点都会被插入一条线,所以:节点数n=插入的总线数+1
n = n i n + 1 \begin{align} n &= n_{in} +1 \\ \end{align} n=nin+1
4.插入总线数=射入总线数=n1+2*n2;
n i n = n o u t \begin{align} n_{in} &= n_{out} \\ \end{align} nin=nout
5.可以得到:
n = n 0 + n 1 + n 2 = n i n + 1 = n o u t + 1 = n 1 + 2 n 2 \begin{align} n &= n_0+n_1+n_2 =n_{in}+1=n_{out}+1=n_1+2n_2\\ \end{align} n=n0+n1+n2=nin+1=nout+1=n1+2n2
即: n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

3.1 两种特殊形式的>二叉-重点会计算

  • 例如:完全>二叉有节点1001个,求叶子节点有多少个?,注意n1只有两种情况,n1=1或者n1=0;

在这里插入图片描述

3.2 题目练习:

在这里插入图片描述
哈夫曼没有度为1的节点,也就是n1=0;

4 >二叉的存储结构

4.1 顺序存储结构

  适合完全>二叉,由>二叉的性质可知,由一个节点 i 我们可以找到他的双亲,左右子节点;如下图:i=1时,直接没有双亲算根节点;例如现在有一个i=2的节点,让你找他的双亲肯定是i/2=1;找他的左孩子就是2i=4,右孩子就是2i+1=5;想一个问题?为什么i的右边是i+1,而 i 的下一层是2i?
这个是因为其是2叉,层与层之间的关系一定是2倍的关系,所以对于三叉,也可以有类似的性质,不过对于三叉而言,其3i是位于中间;

非完全>二叉也可以用顺序存储结构进行存储,不过会浪费存储空间;
在这里插入图片描述

4.2 链式存储结构

  >二叉的链表中的结点至少包含 3 个域:数据域和左、 右指针域,如图 5.9 (b) 所示。有时,为了便于找到结点的双亲,还可在结点结构中增加一个指向其双亲结点的指针域.
在这里插入图片描述

5 遍历>二叉和线索>二叉

5.1 一般是三种遍历顺序(先左后右)

  有先序DLR,中序LDR,和后续LRD的三种遍历方式;这里拿中序举例,对算法程序进行介绍:,如果按照层的形式进行读取,也就是从上到下,从左到右,可以进行队列的设计进行读取,这里采用栈的形式进行遍历是从左到右,没有限定从上到下;

5.1.1 中序-递归法

在这里插入图片描述

5.1.2 中序-非递归法

在这里插入图片描述

5.2 由遍历顺序确定唯一>二叉

  由先序+中序或者后续+中序均能唯一的确定一颗>二叉,其中确定的本质就是利用>二叉的定义是一个递归定义,以及先序是先读取的根,所以由先序可以先确定根,然后再由中序确定左右子,依次确定即可:

5.2.1 题目练习

在这里插入图片描述

5.3 线索>二叉

  就拿中序而讲,一个节点是有五个域,其中分别是:左孩子指针,左孩子标志,节点数据域,右孩子标志位,右孩子指针。线索化>二叉其实就是把先排序,然后前驱后继就出来了,也就是吧节点的空余指针利用起来,如果左孩子为为空,则指向前驱,如果右孩子为空则指向后继;

5.3.1 遍历线索>二叉

  待补充;遍历顺序由先序线索遍历,中续线索遍历和后续线索遍历。

6 森林

  森林的遍历,以及森林>二叉的联系;对于>二叉有四种遍历方式,DLR,LDR,LRD和层次遍历,但是对于而言,就不同了,这里要注意区别;只有先根、后根和层次遍历,没有中序,例如5叉,你一个根有五个节点,那么那个是中间的呢?

6.1 的存储结构

  有很多存储结构,下面这三种是长常用的;

  • 双亲法待补充
  • 孩子法待补充
  • 孩子兄弟法待补充

6.2 的遍历

  的遍历可以类比>二叉的遍历,就是的遍历少了一种中序遍历;

在这里插入图片描述

6.3 森林

  森林是指由零个或多个组成的一个有序集合,其实其定义还是一个递归的定义,因为好多,我拿出来一个,剩余的也是森林,再从这个森林里面拿出一个,剩余的仍然是一个森林森林可分为三部分:
在这里插入图片描述#pic_center

6.4 深林的遍历

  一般有三种遍历方式,就是先序,中序和后序遍历;
  先序遍历就是对深林中的每颗都进行先序遍历,从左往右
  中序遍历就是从左往右依次对深林中的进行后根遍历(注意与森林中,中序的区别)
  森林的中序遍历是指依次森林中的每棵进行后根遍历,而森林的后序遍历是指先对森林中的每棵进行后根遍历,然后再对根结点进行访问

6.5 森林>二叉的转换

  的遍历可以类比>二叉的遍历,就是的遍历少了一种中序遍历;

6.5.1 >二叉的转换

  由转换成>二叉,记住一句口诀:兄弟相连留长子,转45度
  由>二叉,记住一句口诀:左孩右-右连双亲,去掉原来右孩线

>二叉转换 题目练习

在这里插入图片描述
在这里插入图片描述
去掉白线就是答案;

6.5.2 森林>二叉的转换

  由森林转换成>二叉,记住一句口诀:转二叉根相连
  由>二叉转深林,记住一句口诀:去掉全部右孩线,孤立二叉再还原

森林->二叉 题目练习

在这里插入图片描述

7 哈夫曼

  哈夫曼也称为最优,其基本术语有:哈夫曼(Huffman Tree)又称最优>二叉,是一种带权路径长度最短的>二叉

它具有以下几个基本概念:

  1. 权值(Weight):表示每个节点的重要性或出现频率等数值。
  2. 带权路径长度(Weighted Path Length):从的根节点到某一叶子节点的路径上各节点权值的总和。
  3. 构建过程:通过对给定的一组权值进行构造,使得构建出的哈夫曼的带权路径长度总和最小。
  4. 特点
    • 每个非叶子节点都有两个子节点。
    • 叶子节点代表具体的字符或数据。

哈夫曼在数据压缩、编码等领域有广泛应用,其主要优点是能有效地减少编码长度,提高数据的存储和传输效率。
在这里插入图片描述
实现-构造-编码后续补充


http://www.ppmy.cn/devtools/7730.html

相关文章

Mac 下安装PostgreSQL经验

使用homebrew终端软件管理器去安装PostgreSQL 如果没有安装brew命令执行以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 沙果开源物联网系统 SagooIoT | SagooIoT 1.使用命令安装postgreSQL brew i…

算法课程笔记——STL题目

长度为2的字符串,当in下标为一,也就是\n,当i!n,就是输出空格 &&且 city从citys里面取 加速后就不能混用scanf

骑砍2霸主MOD开发(6)-使用C#-Harmony修改本体游戏逻辑

一.C#-Harmony反射及动态注入 利用C#运行时环境的反射原理,实现对已加载DLL,未加载DLL中代码替换和前置后置插桩. C#依赖库下载地址:霸王•吕布 / CSharpHarmonyLib GitCodehttps://gitcode.net/qq_35829452/csharpharmonylib 根据实际运行.Net环境选择对应版本的0Harmony.dll…

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb,目前gdb只支持32位程序调试,暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前,必须确保手机已越狱,否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…

子组件向父组件传参的方式?

在Vue.js中,子组件向父组件传参通常通过自定义事件($emit)来实现。子组件通过触发一个事件,并将需要传递的参数作为事件的负载,父组件在模板中监听这个事件,并在事件处理函数中接收这些参数。 以下是一个简…

【Hadoop】- YARN架构[7]

前言 Yarn架构是一个用于管理和调度Hadoop集群资源的系统。它是Hadoop生态系统的一部分,主要用于解决Hadoop中的资源管理问题。 通过使用Yarn架构,Hadoop集群中的不同应用程序可以共享集群资源,并根据需要动态分配和回收资源。这种灵活的资…

鸿蒙OpenHarmony【轻量系统编写“Hello World”程序】 (基于Hi3861开发板)

编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序,输出“Hello world”。请在下载的源码目录中进行下述操作。 前提条件 已参考鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到…

【java毕业设计】 基于Spring Boot+mysql的社区团购系统设计与实现(程序源码)-社区团购系统

基于Spring Bootmysql的社区团购系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于Spring Bootmysql的社区团购系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获取方式。…