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

目录

  • 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 树和森林
    • 6.1 树的存储结构
    • 6.2 树的遍历
    • 6.3 森林
    • 6.4 深林的遍历
    • 6.5 森林与二叉树的转换
      • 6.5.1 树与二叉树的转换
        • 树和二叉树转换 题目练习
      • 6.5.2 森林与二叉树的转换
        • 森林-二叉树 题目练习
  • 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. 特点
    • 每个非叶子节点都有两个子节点。
    • 叶子节点代表具体的字符或数据。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/580606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv基础篇 ——(九)图像几何变换

图像几何变换是通过对图像的几何结构进行变换来改变图像的形状、大小、方向或者透视关系。常见的图像几何变换包括缩放、旋转、平移、仿射变换和透视变换等。下面对这些几何变换进行简要介绍: 矩阵的转置(transpose ): 对于图像来…

Hot100-哈希法

1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法 class Solution {public int[] twoSum(int[] nums, int target) {int[] result new int[2];for (int i 0; i < nums.length;i){for…

性能监控数据(本地、服务器)

CPU、内存、磁盘等的监控 一、mac本地性能监控 1. top 终端&#xff1a; top load Avg: 平均负载(1分钟&#xff0c;5 分钟&#xff0c;15 分钟)值不能超过 4&#xff0c;要不然就是超负荷运行 Tasks: 进程数 %Cpu(s): idle :剩余百分比 KiB Mem: free:剩余内存&#xff0…

Rancher-Longhorn-新增磁盘以及卷创建原理和卷副本调度规则

一、添加磁盘-官网指引 重点在于&#xff1a; 1、比如你新增了一块盘&#xff0c;你需要做一下事情&#xff1a; 1、执行 lsblk 能找到你的盘。 2、然后执行 fdisk /dev/sdxx 分区你的盘。 3、然后对于分区部署文件系统&#xff0c; mkfs.xfs 4、然后执行 mount /dev/sdxxx 你…

【每日刷题】Day25

【每日刷题】Day25 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 2. 82. 删除排序链表中的重复…

数据结构练习:链表扩容

大致步骤&#xff1a; 一&#xff1a;创建一个新链表&#xff0c;遍历原链表的同时&#xff0c;将原链表的值复制给新链表 二&#xff1a;将新链表插入到原链表中&#xff08;大致如下&#xff09; 注&#xff1a; 1.头结点是不存有数据的 2.记得malloc后要free 3.*&是…

uniapp真机调试无法调用之前页面的方法

在uniapp通过getCurrentPages&#xff08;&#xff09;页面栈调用之前页面方法&#xff0c;h5可生效但app真机调试找不到方法 let pages getCurrentPages()let beforePage pages[pages.length - 3]beforePage.refresh() //真机调试refresh为undefined解决&#xff1a; 后面…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…

操作系统课程--考纲要求

第一/二次课&#xff1a; 绪论 【学习内容与目标】 1、操作系统目标及定义 掌握操作系统的设置目标&#xff0c;理解并掌握操作系统的定义&#xff0c;了解操作系统的地位以及从资源管理者角度和用户角度了解操作系统的组成。 2、 操作系统的特征与功能 掌握操作系统的特征&…

吴恩达2022机器学习专项课程(一) 6.2 逻辑回归第三周课后实验:Lab2逻辑回归

问题预览/关键词 逻辑回归预测分类创建逻辑回归算法Sigmoid函数Sigmoid函数的表示sigmoid输出的结果Numpy计算指数的方法实验python实现sigmoid函数打印输入的z值和sigmoid计算的值可视化z值和sigmoid的值添加更多数据&#xff0c;使用逻辑回归可以正常预测分类![在这里插入图片…

【C++航海王:追寻罗杰的编程之路】C++11(四)

目录 1 -> 相关文章 【C航海王&#xff1a;追寻罗杰的编程之路】C11(一) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(二) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(三) 2 -> lambda表达式 2.1 -> C98中的一个例子 2.2 -> lambda表达式 2.3 ->…

【国产虚拟仪器】 NI-9205模块国产替代,±10 V,250 kS/s,16位,32通道C系列电压输入模块

10 V&#xff0c;250 kS/s&#xff0c;16位&#xff0c;32通道C系列电压输入模块 ​NI‑9205​可​执行​单​端​或​差分​模拟​输入&#xff0c;​每​个​具有​四​个​可​编​程​的​输入​范围。 该​模​块​以​较​低​的​价格​提供​了​高​通道​数​和​高…

Markdown编辑器的使用

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

Netperf网络测试

Netperf网络测试 Netperf简介安装NetperfCentos7安装NetperfWindows安装Netperf 批量网络流量性能测试启动netserver服务端 查看netperf帮助查看netper参数查看netserver参数 TCP_STREAM测试启动netserver服务端客户端 UDP_STREAM测试启动netserver服务端客户端 测试请求/应答网…

【Python】Python语言基础

1、运用python的输入输出函数 2、运行python的条件表达式 3、练习导入库函数并使用 1、运用输入输出函数编写程序&#xff0c;将华氏温度转换成摄氏温度。换算公式&#xff1a;C(F-32)*5/9,其中C为摄氏温度&#xff0c;F为华氏温度。 &#xff08;1&#xff09;源代码&#…

心理学上有个概念叫:习惯性反驳(附上解决办法)

在心理学上&#xff0c;有一个词&#xff0c;叫做习惯性反驳。 什么意思呢&#xff1f; 就是不管你说什么&#xff0c;他都要反驳你&#xff0c;最后把你带入负面的情绪黑洞&#xff0c;搞得你非常崩溃。 一个总是习惯性反驳的人&#xff0c;其实是非常可怕的。 习惯性反驳的3个…

.net EntityFramework EF

创建EF 方法1 方法二 安装的 版本是 中间没有弹出让选框架的界面&#xff0c; EF三种开发方式 1》》 db first 先设计数据库→然后在代码通过EF与数据库建立映射关系&#xff0c;是EF最早的一种使用方式,使用广泛.以数据库为驱动&#xff0c;生成实体模型&#xff0c;从而驱…

喀秋莎Camtasia2023中文破解Crack下载附安装教程 2023免费补丁百度云 电脑版注册机提取

Camtasia2023破解版是一款备受好评的电脑录屏软件&#xff0c;主要用于教授课程&#xff0c;培训他人&#xff0c;以及进行沟通和屏幕分享。内置视频编辑器支持拖放文本&#xff0c;提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等&#xff0…

C#实现 IDbConnection / IDbCommand 等相关通用数据接口

目录 关于数据接口 对象执行流程 范例运行环境 设计与实现 引用 GetConnection方法 GetCommand方法 GetParameter方法 小结 关于数据接口 在.net 应用中&#xff0c;与数据库进行连接、访问和执行经常会用到数据接口的相关对象&#xff0c;如下&#xff1a; 1、 Con…

【深度学习实战(26)】标签处理之语义分割标签转换,数据集划分

一、标签转换 我们在使用labeme标签工具&#xff0c;标注完数据后会获得json文件。在标注结束过后&#xff0c;我们需要通过标签转换操作&#xff0c;生成jpg格式原始图片和png格式mask标签图。 1.1 使用img_b64_to_arr将json标签中二进制图像数据变成numpy格式数据&#xf…