树的基本概念与二叉树
文章目录
- 树的基本概念与二叉树
- 一、树的概念和结构
- 1. 树的概念
- 2. 树的相关概念
- 二、树的存储
- 1. 左孩子右兄弟表示法
- 2. 双亲表示法
- 三、二叉树
- 1. 特殊的二叉树
- 1.1 满二叉树
- 1.2 完全二叉树
树的基本概念与二叉树
一、树的概念和结构
1. 树的概念
树是一种非线性的数据结构,它是由 n (n≥0) 个有限结点组成一个具有层次关系的集合。之所以称之为"树",是因为它的结构看起来像一棵倒挂的树,根朝上,叶子朝下。树具有以下特点:
- 有一个特殊的节点,称为根节点,根节点没有前驱节点。
- 除根节点外,其余节点被分成 M 个 (M>0) 互不相交的集合。
- 树是递归定义的。
- 在树形结构中,子树之间不能有交集,否则就不是树形结构。
2. 树的相关概念
- 节点的度: 一个节点含有的子树的个数称为该节点的度。
- 叶节点或终端节点: 度为 0 的节点称为叶节点。
- 非终端节点或分支节点: 度不为 0 的节点。
- 双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点。
- 孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点。
- 兄弟节点: 具有相同父节点的节点互称为兄弟节点。
- 树的度: 一棵树中,最大的节点的度称为树的度。
- 节点的层次: 从根节点开始定义,根为第一层,根的子节点为第二层,以此类推。
- 树的高度或深度: 树中节点的最大层次。
- 堂兄弟节点: 双亲在同一层的节点互为堂兄弟。
- 节点的祖先: 从根到该节点所经分支上的所有节点。
- 子孙: 以某节点为根的子树中任一节点都称为该节点的子孙。
- 森林: 由 m (m>0) 棵互不相交的树的集合称为森林。
需要注意的是:
- 当树为空树时,树的高度/深度通常设为 0。
- 子树之间是不能相交的。
- 除了根节点外,每个节点有且仅有一个父节点。
- 一棵拥有 N 个节点的树有 N-1 条边。
二、树的存储
1. 左孩子右兄弟表示法
左孩子右兄弟表示法是树形结构的一种常见且最优的存储方式。其结点结构如下:
struct TreeNode {int val;struct TreeNode* firstChild; // 指向最左边的第一个孩子结点struct TreeNode* nextSibling; // 指向当前节点右边一个兄弟结点
};
- firstChild: 指向最左边的第一个孩子结点,如果没有则指向 null。
- nextSibling: 指向当前节点右边的一个兄弟节点,如果没有则指向 null。
2. 双亲表示法
双亲表示法不存储指向孩子的指针,只存储指向父亲的指针或下标。
- 不支持从根找孩子,只支持从孩子找父亲。
- 判断两个节点是否在同一棵树中,可以通过寻找它们的根节点是否相同来确定。
- 并查集就是使用双亲表示法实现的。
- 根节点没有父亲,所以通常存储 -1。
三、二叉树

二叉树是一种特殊的树形结构,它实行了"计划生育",每个节点最多只能有两个孩子。二叉树具有以下特点:
- 二叉树中不存在度大于 2 的节点,每个节点最多有两个孩子,也可以只有一个孩子或没有孩子。
- 二叉树由一个根节点以及两棵分别称为左子树和右子树的二叉树组成。
- 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
- 二叉树有多种情况:空树、只有根节点、只有左子树、只有右子树以及左右子树都存在。
1. 特殊的二叉树
1.1 满二叉树
满二叉树是指一棵二叉树的每一层节点数都达到最大值。对于一棵高度为 h 的满二叉树,它一共有 (2^h)-1 个节点。证明如下:
设 F(h) 表示高度为 h 的满二叉树的节点总数,则有:
F(h) = 2^0 + 2^1 + 2^2 + ... + 2^(h-2) + 2^(h-1)
这是一个等比数列,其前 n 项和公式为:
Sn = (a1 * (1 - q^n)) / (1 - q)
代入 a1 = 1, q = 2, n = h,得:
F(h) = (2^h) - 1
另一种证明方法是错位相减法:
- `2F(h) = 2^1 + 2^2 + 2^3 + … + 2^(h-1) + 2^h
F(h) = 2^0 + 2^1 + 2^2 + ... + 2^(h-2) + 2^(h-1)
F(h) = 2^h - 2^0 = 2^h - 1
1.2 完全二叉树
完全二叉树是由满二叉树引出来的,其效率很高。满二叉树是完全二叉树的一种特殊情况。
假设二叉树的高度为 h,则完全二叉树满足以下条件:
- 前 h-1 层都是满的。
- 第 h 层不一定满,但第 h 层的节点从左到右是连续的。
对于高度为 h 的完全二叉树,其节点数的范围是 [2^(h-1), 2^h - 1]。
以上就是对树的基本概念以及二叉树的介绍。树是一种非常重要且常用的数据结构,在计算机科学领域有着广泛的应用。深入理解树的概念和特性,对于解决实际问题和优化算法设计都有很大帮助。
相关文章:
树的基本概念与二叉树
文章目录 树的基本概念与二叉树一、树的概念和结构1. 树的概念2. 树的相关概念 二、树的存储1. 左孩子右兄弟表示法2. 双亲表示法 三、二叉树1. 特殊的二叉树1.1 满二叉树1.2 完全二叉树 树的基本概念与二叉树 一、树的概念和结构 1. 树的概念 树是一种非线性的数据结构,它是…...
什么是物理服务器?
物理服务器又叫做独立服务器,指物理上的单独服务器,是有着实体的服务器并不是虚拟的,物理服务器也可以理解成一台超大的电脑,但是对于普通的家用电脑来说,物理服务器需要长期处于开机的状态,对于硬件性能消…...
数据结构:详解【树和二叉树】
1. 树的概念及结构(了解) 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝…...
“成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用“
遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能…...
semhear环境sox
这里写自定义目录标题 pip list 看到当前环境下已经有sox了怀疑跟torchaudio和torchvision有关,更新了一下:装了torchvisionsox还是找不到 pip list 看到当前环境下已经有sox了 怀疑跟torchaudio和torchvision有关,更新了一下: p…...
如何快速开启一个项目-ApiHug - API design Copilot
ApiHug101-001开启篇 🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin |…...
从用友U9到钉钉通过接口配置打通数据
从用友U9到钉钉通过接口配置打通数据 接通系统:用友U9 用友U9cloud深耕制造领域十三载,U9cloud在机械、电子、汽配、家具、整车、军工等细分行业有着深厚的积累,尤其是机械、电子和汽配行业,不但打造了多个成熟的产品模式和应用场…...
PyQt qrc2py 使用PowerShell将qrc文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用
前言 由于需要使用不同的qt环境(PySide,PyQt)所以写了这个脚本,使用找到的随便一个rcc命令去转换qrc文件,然后将导入模块换成qtpy这个通用库(支持pyside2-6,pyqt5-6),老版本的是Qt.py(支持pysi…...
phpstorm设置头部注释和自定义注释内容
先说设置位置: PhpStorm中文件、类、函数等注释的设置在:setting-》Editor-》FIle and Code Template-》Includes-》PHP Function Doc Comment下设置即可,其中方法的默认是这样的: /** ${PARAM_DOC} #if (${TYPE_HINT} ! "…...
【数据分析面试】10. 计算平均通勤时间(SQL:timestampdiff() 和datediff()区别)
题目 假设你在Uber工作。rides表包含了关于Uber用户在美国各地的行程信息。 编写一个查询,以获取纽约(NY)每位通勤者的平均通勤时间(以分钟为单位),以及纽约所有通勤者的平均通勤时间(以分钟为…...
2024年150道高频Java面试题(二十二)
43. ArrayList 和 Vector 的区别是什么? ArrayList 和 Vector 是 Java 中用于存储对象的两种不同类型的动态数组。它们都实现了 List 接口,但存在一些重要的区别: 同步性: ArrayList 是不同步的,意味着它不是线程安全…...
如何使用校园网——Win10笔记本,台式机互开热点
当我们使用校园网的时候,往往只能连接一个电脑端,但是又想两个机子同时连接WIFI怎么办呢? 当然,前提条件是你先得其中一台电脑有网络哈 1、打开想开共享热点的电脑的设置 A、点击WIN,再点击设置 2、点击网络和Inte…...
c#:简洁实现if-else语句
c#:简洁实现if-else语句 在C#中,可以使用三元运算符(? :)来简洁地实现if-else语句。其语法格式为: 条件表达式 ? 表达式1 : 表达式2 例如:当条件表达式为真时,返回表达式1的值,否…...
金融贷款批准预测项目
注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 在金融服务行业,贷款审批是一项关键任务,它不仅关系到资金的安全,还直接影响到金融机构的运营效率和风险管理…...
FR中隐藏系统管理--用户管理中 表格中每条数据中的编辑按钮,删除按钮
比如隐藏删除按钮: var userTableTools BI.Constants.getConstant("dec.constant.user.table.tools")for(var key in userTableTools){if(key "delete"){var deleteItem userTableTools["delete"]deleteItem.invisible true;}}...
函数重载和引用【C++】
文章目录 函数重载什么是函数重载?函数重载的作用使用函数重载的注意点为什么C可以函数重载,C语言不行? 引用什么是引用?引用的语法引用的特点引用的使用场景引用的底层实现传参时传引用和传值的效率引用和指针的区别 函数重载 什…...
rust-tokio发布考古
源头: Carl Lerche Aug 4, 2016 I’m very excited to announce a project that has been a long time in the making. 我很兴奋地宣布一个酝酿已久的项目。 Tokio is a network application framework for rapid development and highly scalable deployments…...
3D医疗图像配准 | 基于Vision-Transformer+Pytorch实现的3D医疗图像配准算法
项目应用场景 面向医疗图像配准场景,项目采用 Pytorch ViT 来实现,形态为 3D 医疗图像的配准。 项目效果 项目细节 > 具体参见项目 README.md (1) 模型架构 (2) Vision Transformer 架构 (3) 量化结果分析 项目获取 https://download.csdn.net/down…...
设计模式(18):状态模式
核心 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题 结构 环境类(Context): 环境类中维护一个State对象,它定义了当前的状态,并委托当前状态处理一些请求; 抽象状态类(State): 用于封装对象的一个特定状态所对应的行为&a…...
如果用大模型考公,kimi、通义千问谁能考高分?
都说大模型要超越人类了,今天就试试让kimi和通义千问做公务员考试题目,谁能考高分? 测评结果再次让人震惊! 问题提干:大小两种规格的盒装鸡蛋,大盒装23个,小盒装16个,采购员小王买了…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
