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

目录

  • 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/563228.html

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

相关文章

竞逐智能家居大模型:美的“蓄力”,海尔“疾行”

配图来自Canva可画 随着ChatGPT火热出圈,AI大模型便成为了各行各业必争的高地。“BAT”等互联网大厂、华为、小米等通讯巨头,以及一些垂直AI公司,都开始在大模型市场积极布局。众所周知,发展大模型的关键在于应用场景的落地&…

超星图书转成PDF格式

转为pdf 为避免浪费您的时间,本篇转载文章不值得花费您的宝贵时间阅读 方法一 感谢医学插画动画杜鹏 Roison An两位提供的方法,经试验后简化了一下,得出以下方法:1、使用超星打开你想要转换的图书2、依次打开本书的所有页面,不要…

Linux基础和常见命令速览

来源:Linux 基础知识总结 | JavaGuide 一、Linux文件系统 1. 文件系统 Linux 系统中的一个重要的概念:一切都是文件。 在 Linux 操作系统中,一切被操作系统管理的资源,如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件…

(避雷指引:管理页面超时问题)windows下载安装RabbitMQ

一、背景: 学习RabbitMQ过程中,由于个人电脑性能问题,直接装在windows去使用RabbitMQ,根据各大网友教程,去下载安装完之后,使用web端进行简单的入门操作时,总是一直提示超时,要么容…

Electron+Vue3整合-开发时整合-全部ts开发 + 一条命令启动vue3和electron两个服务

说明 本文介绍一下 Electron Vue3 的整合的中级操作。实现的效果是 : 1、一个正常的Vue3项目; 2、整合加入 Electron 框架 :开发时只执行一条命令,启动 vue 项目 后 再启动 electron;electron 的开发使用 typescript…

Office疑难杂症-Word页码重复无法修改

在现代办公环境中,Microsoft Office 套件扮演着不可或缺的角色,尤其是 Word 文档处理软件,在日常生活和工作中的应用广泛。然而,即使是这样成熟的软件,也不免有一些令人头疼的技术问题。本文将详细介绍如何解决Word中页…

深度学习之图像分割从入门到精通——基于unet++实现细胞分割

模型 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channels, …

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测; 2.输入7个特征&#xf…

互联网技术知识点总览——数据库知识点框架

简介 本文对数据库的知识点整体框架进行梳理和分享如下:

Vue3+TS版本Uniapp:封装uni.request请求配置

作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例(在create方法中写入请求…

Oracle中的视图

1- 什么是视图 视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户,订单,物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图 …

【 AIGC 研究最新方向(下)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种: 透明图层生成可控生成图像定制化SVG 生成 本篇(下篇)介绍 3、4,上篇在:https://blog.csdn.net/weixin_44212848/article/details/138035279?spm…

CSS——高级选择器

层次的选择器&#xff1a; <1> 后代选择器&#xff1a; 格式&#xff1a; 标签1 标签2{} 解释&#xff1a; 标签1 不生效&#xff0c;被标签1 嵌套中的 标签2才生效 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charse…

JVM常见的垃圾回收器

1、回收方法区&#xff1a; 方法区回收价值很低&#xff0c;主要回收废弃的常量和无用的类。 方法区中的存储&#xff1a; 方法区中存储的是加载的类的信息&#xff0c;常量&#xff0c;静态变量&#xff0c;即时编译后的代码等数据&#xff0c;所以回收的对象也就是这些内…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

【leetcode面试经典150题】66. 分隔链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

第24天:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制

第二十四天 一、PHP文件管理-显示&上传功能实现 如果被抓包抓到数据包&#xff0c;并修改Content-Type内容 则也可以绕过筛查 正常进行上传和下载 二、文件上传-$_FILES&过滤机制实现 无过滤机制 黑名单过滤机制 使用 explode 函数通过点号分割文件名&#xff0c;…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 小区物业管理系统 的设计与实现

一.项目介绍 系统分为管理员 和 业主 两块&#xff1a; 管理员点击进入到系统操作界面&#xff0c;可以对首页、业主信息管理、管理员信息管理、 楼栋和房屋信息管理、物业费管理、地下停车位管理、公告信息管理、报修信息管理、 投诉管理以及个人信息等功能模块 …

温湿度LCD显示并上传服务器

项目需求 通过温湿度传感器将值传到LCD1602&#xff0c;并实时通过蓝牙透传到手机。 硬件介绍 温湿度传感器 DHT11温湿度传感器 DHT11_温湿度传感器数据格式-CSDN博客 LCD1602LCD1602-CSDN博客 HC-01 继电器模块 硬件接线 LCD1602 D0~D7 --> A0~A7VDD, A --> 5v…

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#x…