数据结构与算法(二叉树)

树的概念与结构

1. 树是⼀种非线性的数据结构,它是由 n 个有限结点组成的⼀个具有层次关系的集合。
2. 之所以把它叫做树,是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下。
2. 有⼀个特殊的结点,称为根结点,根结点没有前驱结点(父节点)。

3. 除根结点外,其余结点被分成 M(M>0) 个互不相交的集合,其中每⼀个集合又是⼀棵结构与树类似的子树。

4. 每棵子树的根结点有且只有⼀个前驱,可以有 0 个或多个后继(子节点)。因此,树是递归定义的。

5. 树形结构中,子树之间不能有交集,否则就不是树形结构。

6. 除了根结点外,每个结点有且仅有⼀个父结点(根节点没有父节点)。

7. ⼀棵N个结点的树有N-1条线(每多一个节点,就多一条线)。

树的相关术语

1. 父结点:若⼀个结点含有子结点,则这个结点就称为其子结点的父结点; 如上图:A是B的父结点。

2. 子结点:⼀个结点含有的子树的根结点,就称为该结点的子结点; 如上图:B是A的子结点。

3. 结点的度:⼀个结点有几个子节点,他的度就是多少;比如A的度为6,F的度为2,K的度为0。

4. 兄弟结点:具有相同父结点的结点,互称为兄弟结点; 如上图: BC 是兄弟结点。

5. 树的度:⼀棵树中,最大的结点的度称为树的度; 如上图:树的度为 6。

6. 叶子结点:度为 0 的结点称为叶结点; 如上图: BCHI... 等结点为叶结点。

7. 分支结点:度不为 0 的结点; 如上图: DEFG... 等结点为分支结点。

8. 结点的层次:从根开始定义起,根为第 1 层,根的子结点为第 2 层,以此类推。

9. 树的高度(深度):树中结点的最大层次; 如上图:树的高度为 4。

10. 结点的祖先:从根到该结点所经分支上的所有结点;如上图: A 是所有结点的祖先。

11. 结点的子孙:以某结点为根的子树中任⼀结点都称为该结点的子孙。如上图:所有结点都是A的子孙。

12. 路径:⼀条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列;比如A到Q的路径为: A-E-J-Q;H到Q的路径H-D-A-E-J-Q。

13. 森林:由 m  棵互不相交的树的集合称为森林。

树的表示 

1. 相对线性表结构,树结构更加复杂,既然保存值域,也要保存结点和结 点之间的关系。

2. 实际中,树有很多种表示方法如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子

兄弟表示法等。我们这里就简单的了解其中最常用的 孩子 兄弟表示法。
#define _CRT_SECURE_NO_WARNINGS
typedef struct TreeNode
{struct TreeNode* child;struct TreeNode* brother;int data;
}TreeNode;

二叉树

1. 在树形结构中,我们最常用的就是二叉树,⼀棵二叉树是结点的⼀个有限集合,该集合由⼀个根结点加上两棵别称为左子树和右子树的二叉树组成(或者为空)。
2. 二叉树不存在度大于 2 的结点。
3. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

 

 满二叉树

1. ⼀个二叉树,如果每⼀个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果⼀个二叉树的层数为 K ,且结点总数是 2^k − 1 ,则它就是满二叉树。

完全二叉树 

1. 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。
2. 要注意的是满二叉树是⼀种特殊的完全二叉树。
3. 假设二叉树层数为K层,除了第K层外,每层节点的个数达到最大节点的个数,而第K层节点个数不一定达到最大节点数,并且第K层节点顺序是严格从左到右的,那么这个二叉树就是完全二叉树。

 二叉树的性质

1. 若规定根结点的层数为 1 ,则⼀棵非空二叉树的第 i 层上最多有 2^(i−1)个结点。

2. 若规定根结点的层数为 1 ,则深度为 h 的二叉树的最大结点数是 2^h − 1。

3. 若规定根结点的层数为 1 ,具有 n 个结点的满二叉树的深度 h = log2 (n + 1) ( log

以2为底,( n+1) 为对数)。

 二叉树存储结构

二叉树⼀般可以使用两种结构存储,⼀种顺序结构,⼀种链式结构。

顺序结构 

1. 二叉树的顺序结构存储就是使用数组来存储,⼀般使用数组只适合表示完全⼆叉树,因为不是完全二叉树会有空间的浪费,完全二叉树更适合使用顺序结构存储。
2. 我们通常把堆(⼀种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,⼀个是数据结构,⼀个是操作系统中管理内存的⼀块区域分段。
3. 根据数学关系我们可以得到数学公式,再根据顺序结构中不能跳的原则,从而得出节点的信息。

 链式结构

1. 二叉树的链式存储结构是指:用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 2. 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩 子所在的链结点的存储地址 。

3. 链式结构又分为二叉链和三叉链(多了一个指向父节点的指针),博客中⼀般都是二叉链。

实现顺序结构二叉树

1. 堆是⼀种特殊的二叉树,具有二叉树的特性的同时,还具备其他的特性。
2. 堆一般使用顺序结构的数组来实现。

 堆的性质与结构

1. 堆中某个结点的值总是不大于或不小于其父结点的值。(可以等于)

2. 越往上,值越大的堆,就是大根堆;越往上,值越小的堆,就是小根堆。

3. 小根堆的堆顶是最小值;大根堆的堆顶是最大值。

4. 堆总是⼀棵完全二叉树。

1. 对于具有 n 个结点的完全二叉树,按照从上至下、从左至右的数组顺序对所有结点从 0 开始编号,最后节点的序号为(n-1)。

2. 若 i>0 ,则 结点的父节点序号为: ( i - 1 ) / 2 ;若 i=0 ,则 i 为根结点编号,无父结点。

3. 2i+1<n ,左孩子序号: 2i+1 ; 2i+1>=n 否则无左孩子,发生了越界。

4. 若 2i+2<n ,右孩子序号: 2i+2 ; 2i+2>=n 否则无右孩子,发生了越界。

 致谢

  感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS应用开发者基础认证——初级闯关习题参考答案大全

相关文章 HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全 HarmonyOS应用开发者高级认证——高级闯关习题参考答案大全 文章目录 HarmonyOS第一课 HarmonyOS介绍判断题单选题多选题 HarmonyOS第一课 DevEco Studio的使用判断题单选题多选题 HarmonyOS第一课 ArkTS语法…

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…

使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图

最近那个男人写的汉语新解火遍了全网&#xff0c;那个男人叫李继刚&#xff0c;国内玩 AI 的同学如果不知道这个名字&#xff0c;可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词&#xff0c;效果却顶得上几千行代码写出来的应用程序。 这段提示词…

面试域——岗位职责以及工作流程

摘要 介绍互联网岗位的职责以及开发流程。在岗位职责方面&#xff0c;详细阐述了产品经理、前端开发工程师、后端开发工程师、测试工程师、运维工程师等的具体工作内容。产品经理负责需求收集、产品规划等&#xff1b;前端专注界面开发与交互&#xff1b;后端涉及系统架构与业…

【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)

一、TEMT6000光照强度传感器 火焰传感器是一种能够检测火焰的传感器&#xff0c;它通过检测空气中的特定波长的光线来检测火焰的存在&#xff0c;并输出一个信号来通知系统发生了火灾 工作原理 火焰传感器的工作原理基于光学检测技术。当火焰燃烧时&#xff0c;会产生一些特…

Python 实现 excel 数据过滤(从入门到exe)

一、场景分析 假设有如下一份 excel 数据 shop.xlsx, 写一段 python 程序&#xff0c;实现对于车牌的分组数据过滤。 并以车牌为文件名&#xff0c;把店名输出到 车牌.txt 文件中。 比如 闽A.txt 文件内容为&#xff1a; 小林书店福州店1 小林书店福州店2 二、依赖安装 程序依…

乘云而上,OceanBase再越山峰

一座山峰都是一个挑战&#xff0c;每一次攀登都是一次超越。 商业数据库时代&#xff0c;面对国外数据库巨头这座大山&#xff0c;实现市场突破一直都是中国数据库产业多年夙愿&#xff0c;而OceanBase在金融核心系统等领域的攻坚克难&#xff0c;为产业突破交出一副令人信服的…

消防应急救援系留照明无人机技术详解

消防应急救援系留照明无人机技术是一种专门用于消防应急救援场景&#xff0c;通过系留技术实现长时间悬停并提供高效照明服务的高科技解决方案。以下是对该技术的详细解析&#xff1a; 一、系统组成 消防应急救援系留照明无人机系统主要由无人机平台、LED照明灯组、系留供电系…

PowerBI 根据条件选择获得不同的表格 因为IF和SWITCH只能返回标量而不能返回表格 Power BI

PowerBI 根据条件选择返回不同的表格 因为IF和SWITCH只能返回标量而不能返回表格 Power BI 自定义日期筛选套件 根据条件得到不同的表格 背景 在设置自定义对比日期时&#xff0c;需要根据选择的内容返回不同的表格作为CALCULATE的表格参数进行计算。 图1&#xff1a;Power …

2024年10款好用的图纸加密软件推荐|企业CAD图纸加密指南!

在当今数字化时代&#xff0c;企业的 CAD 图纸等重要设计文件面临着日益严峻的安全风险。为了保护企业的核心知识产权和商业机密&#xff0c;选择一款可靠的图纸加密软件至关重要。下面为大家推荐 2024 年 10 款好用的图纸加密软件&#xff0c;为企业提供 CAD 图纸加密指南。 一…

设计资讯 | 塑造数字交互未来的 Sol Reader

虚拟现实 (VR) 在过去几年中不断创新和发展。它真正突破了沉浸式体验的极限。VR 技术目前正在提高视觉保真度&#xff0c;甚至融入其他感官&#xff0c;从而彻底改变我们与数字世界的互动方式。 来看看世界上第一款 VR 电子书阅读器——Sol Reader。它为狂热的读者提供了一种独…

Linux下MySQL8.x的编译安装与使用

Linux下MySQL的安装与配置 1. 安装环境初始化 1.1 查看是否安装过MySQL 如果使用rpm安装, 检查一下RPM PACKAGE rpm -qa | grep -i mysql # -i 忽略大小写 # 或者 yum list installed | grep mysql如果存在mysql-libs的旧版本包&#xff0c;显示如下 #存在 [rootlocalhost ~]…

一文解决单调栈的应用

单调栈的定义&#xff1a; 单调栈是栈的一中特殊形式&#xff0c;在栈中的元素必须满足单调性&#xff08;一定是单调上升或单调下降等等的规律&#xff09;。 单调栈的性质&#xff1a; 单调栈解决的问题 单调栈解决的常见问题&#xff1a;给定一个序列&#xff0c;求每个位置…

.NET 8 中的 Mini WebApi

介绍 .NET 8 中的极简 API 隆重登场&#xff0c;重新定义了我们构建 Web 服务的方式。如果您想知道极简 API 的工作原理以及它们如何简化您的开发流程&#xff0c;让我们通过一些引人入胜的示例来深入了解一下。 .NET 极简主义的诞生 想想我们曾经不得不为一个简单的 Web 服务…

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录&#xff0c;默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下&#xff0c;文件名称 mkdir 在当前目录下&#xff0c;创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

esp32 GPIO 分别用5种中断类型控制LED

下面程序分别用ANYEDGE POSEDGE NEGEDGE HIGH_LEVEL LOW_LEVEL 中断类型控制GPIO 0 脚的电平。此程序的重点是用延时消除按键产生的无用中断信号 硬件 1. led 接0脚和地 2. 按钮接gpio 1脚 和地或3.3v 脚 图片 程序 #include "driver/gpio.h" #incl…

ansible开局配置-openEuler

ansible干啥用的就不多介绍了&#xff0c;这篇文章主要在说ansible的安装、开局配置、免密登录。 ansible安装 查看系统版本 cat /etc/openEuler-latest输出内容如下&#xff1a; openeulerversionopenEuler-24.03-LTS compiletime2024-05-27-21-31-28 gccversion12.3.1-30.…

金蝶云星空采购退料单集成易仓出库单实现高效数据对接

金蝶云星空采购退料单集成易仓出库单实现高效数据对接 Done-金蝶-采购退料单——>易仓-出库单&#xff1a;高效数据集成方案解析 在企业的日常运营中&#xff0c;数据的准确传递和实时处理至关重要。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中…

基于Ubuntu24.04,下载并编译Android12系统源码 (二)

1. 前言 上篇文章&#xff0c;我们基于Ubuntu24.04&#xff0c;已经成功下载下来了Android12的源码&#xff0c;这篇文章我们会接着上文&#xff0c;基于Ubuntu24.04来编译Android源码。 2. 编译源码 2.1 了解源码编译的名词 Makefile &#xff1a; Android平台的一个编译系…

CMake 生成器表达式介绍

【写在前面】 生成器表达式在构建系统生成期间进行评估&#xff0c;以生成特定于每个构建配置的信息。它们的形式为 $<...>。例如&#xff1a; target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>) 这将扩展为 “/opt/include/GNU”、“/opt…