当前位置: 首页 > news >正文

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录

一、前言

🍎 为什么要学习非线性结构 ---- 树(Tree)

💦 线性结构的优缺点

 💦 优化方案 ----- 树(Tree)

💦 树的讲解流程

 二、树的概念及结构

🍐 树的概念

🍉 树的相关定义

 🍓 树的表示方法

 🍌 树在现实中的应用

 🍊 树的性质(超重要哦!!)

 💦 性质1:树中的节点数等于所有节点度数加 1

 💦 性质2:度为 m 的树中第 i 层至多有 m^i-1 个节点(i>=1)

 💦 性质3:高度为 h 的 m 叉树至多有  m^h-1/m-1 个节点​

 💦 性质4:具有n个结点的m叉树的最小高度为⌈logm(n*(m-1)+1)⌉

 三、共勉


一、前言

         在之前的几篇文章中已经详细的介绍了数据结构中的顺序表、链表、栈、队列、数组等,都是一对一的线性关系。本文将开始介绍一种新的数据结构 --------- (一对多的非线性关系)。

         那么肯定有 老铁 要发问啦,有线性结构去存储数据,为什么还要用非线性的结构去存储呢 ?它们之间有什么区别呢 ? 接下里我将依次给大家解惑,让大家真正的搞懂数据结构,学习起来才有动力。

🍎 为什么要学习非线性结构 ---- 树(Tree)

💦 线性结构的优缺点

在线性结构中,无论是顺序存储,还是链式存储,线性表均有其优缺点:

🔑顺序表优点:

1️⃣:顺序存储可以在 O(1) 的时间内找到特定次序的元素(下标的随机访问)

2️⃣:CPU 高速缓存,命中率较高

🔑顺序表缺点: 

1️⃣:顺序存储在,数据中间、头部 的插入和删除元素需要挪动大量元素,需要时间O(n)

2️⃣:  顺序存储时,会出现空间不足,只能进行空间的扩容(异地扩容代价比较大)


🔑链表优点:

1️⃣:在任意位置进行数据的插入和删除的效率高,所需时间为O(1)

2️⃣:  按需申请空间和释放,不存在扩容

🔑链表的缺点:

1️⃣:在寻找特定次序的元素需要从链表头部向后查找,需要时间O(n)

2️⃣:  CPU高速缓存,命中率低 


⭐ :其实链表和顺序表是一个互补的数据结构
⭐ :链表详解

⭐ :顺序表详解

 💦 优化方案 ----- 树(Tree)

⭐:树形结构:很好的结合了顺序表和链表的优点,可以在O(logn)的时间内完成查找、更新、插入、删除等操作,在实际的应用中,很多算法可以借助于树形结构高效的实现很多功能。

💦 树的讲解流程

此时此刻大家肯定很想了解什么是,在本篇博客中,并不能把所有树的结构在此篇文章中进行详细的介绍,我会通过步步延申的方式去讲解树。


树 ➡ 二叉树➡ 搜索二叉树 ➡ 平衡搜索二叉树 (AVL树和红黑树) ➡ M叉多叉平衡搜索树 (B树和B+树)

 

 二、树的概念及结构

🍐 树的概念

1️⃣:是一种非线性的数据结构,它是由 n (n>=0) 个有限结点组成一个具有层次关系的集合。

2️⃣: 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下。树根可以发出多个分支,每个分支也可以继续发出分支,树枝之间是不想交的。
3️⃣ :树有一个特殊的结点,称为
根结点,根节点没有前驱结点

4️⃣:除根节点外,其余结点被分为 M (M>0) 个互不相交的集合 T1、T2 … 、Tm,其中每一个集合 Ti (1<=i<=m) 又是一棵结构与树类似的子树,每棵子树的根结点有且只有一个前驱,可以有0个或多个后继

5️⃣:因此,树是递归定义的

 ⚠ 注意:树形结构中,子树之间不能有交集,否则就不是树形结构

▶  子树 是不相交的

▶  除了根节点外,每个节点有且仅有一个父节点

▶  一棵 N 个节点的树有 N-1 条连

🍉 树的相关定义

1️⃣ 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A 的为6

2️⃣ 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点

3️⃣ 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点

4️⃣ 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A 是 B 的父节点

5️⃣ 孩子节点或子节点:个节点含有的子树的根节点称为该节点的子节点; 如上图:B 是 A 的孩子节点

6️⃣ 兄弟节点:具有相同父节点的节点互称为兄弟节点 (这里指的是亲兄弟,而非表堂兄弟); 如上图:B、C 是兄弟节点

7️⃣ 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为 6

8️⃣ 节点的层次:从根开始定义起,根为第 1 层,根的子节点为第 2 层, 以此类推;如上图:树的层次为 4

9️⃣ 树的高度或深度:树中节点的最大层次 (这里有 2 种说法:其一,根算 0,其二,根算 1); 如上图:树的高度为 4
   这里推荐理解其二,因为:
  
当要算空树的高度是多少时,按其一的理解,高度是 -1;按其二的理解,高度是 0
   当要算只有一个根节点的树的高度是多少时,按其一的理解,高度是 0;按其二的理解,高度是 1

🔟 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I 互为兄弟节点

1️⃣1️⃣ 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A 是所有节点的祖先

1️⃣2️⃣ 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是 A 的子孙

1️⃣3️⃣ 森林:由 m(m>0) 棵互不相交的树的集合称为森林,并查集就是一个森林
 

 🍓 树的表示方法

1️⃣: 树结构相对线性表就比较复杂了,要存储表示起来比较麻烦,既要保存值域,也要保存结点和结点之间的关系。

2️⃣: 实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法

 ⚠ 注意:对于树的定义其实并不好定义,因为其中有许多未知的因素

1️⃣明确说明树的度是多少,比如树的度是 6

struct TreeNode
{int data;//这种结构其实是很浪费的,因为最大的度是6,但往下可能并没有那么多struct TreeNode* subs[6];//指针数组
}

⚠ 注意:这种结构其实是很浪费的,因为最大的度是6,但往下可能并没有那么多

 2️⃣:双亲表示法

struct TreeNode
{int data;struct TreeNode* parent;
}

⚠ 注意:这种结构主要应用在------并查集

 3️⃣:左孩子右兄弟表示法 (比较实用)

typedef int DataTpye;
struct Node
{struct Node* _firstChild1;//第一个孩子节点(如有多个孩子,那么只指向最左边的)struct Node* _pNextBrother;//指向下一个兄弟节点DataType _data;//节点中的数据域
}

 🍌 树在现实中的应用

❗ 以下为 Linux 下的目录树 ❗

由此可知,在用树表示目录数据结构中,从根目录到任何数据文件,仅有唯一一条路径可以达到,因为树的结构不是相交的。

 🍊 树的性质(超重要哦!!)

 

💦 性质1:树中的节点数等于所有节点度数加 1

✨:从上图可知,有 12 个节点  ,A的度为:3, B的度为2, C 的度为1, D的度为2, E的度为1, F的度为0, G的度为2, H的度为0 , I的度为0,J的度为0,K的度0,L的度为0。


✨:由性质 1 可知 树的节点个数 = 每个节点的度数 + 1 

所以上图 树的节点数 = (3+2+1+2+1+0+2+0+0+0+0+0)+1 = 12

 💦 性质2:度为 m 的树中第 i 层至多有 m^i-1 个节点(i>=1)


 💦 性质3:高度为 h 的 m 叉树至多有  m^h-1/m-1 个节点


 

 💦 性质4:具有n个结点的m叉树的最小高度为⌈logm(n*(m-1)+1)⌉



 

 三、共勉

以下就是我对数据结构---的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对数据结构-------二叉树请持续关注我哦!!!!!  

 

相关文章:

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录 一、前言 &#x1f34e; 为什么要学习非线性结构 ---- 树&#xff08;Tree&#xff09; &#x1f4a6; 线性结构的优缺点 &#x1f4a6; 优化方案 ----- 树&#xff08;Tree&#xff09; &#x1f4a6; 树的讲解流程 二、树的概念及结构 &#x1f350; 树的概念 &…...

融合之力:数字孪生、人工智能和数据分析的创新驱动

数字孪生、人工智能&#xff08;AI&#xff09;和数据分析是当今科技领域中的三个重要概念&#xff0c;它们之间存在着紧密的关联和互动&#xff0c;共同推动了许多领域的创新和发展。 一、概念 数字孪生是一种数字化的模拟技术&#xff0c;它通过复制现实世界中的物理实体、…...

Spring的注解开发-Spring配置类的开发

Bean配置类的注解开发 Component等注解替代了<bean>标签&#xff0c;但像<import>、<context:componentScan>等非<bean>标签怎样去使用注解去替代呢&#xff1f;定义一个配置类替代原有的xml配置文件&#xff0c;<bean>标签以外的标签&#xff…...

Linux系统编程系列之进程间通信-信号量组

一、什么是信号量组 信号量组是信号量的一种&#xff0c; 是system-V三种IPC对象之一&#xff0c;是进程间通信的一种方式。 二、信号量组的特性 信号量组不是用来传输数据的&#xff0c;而是作为“旗语”&#xff0c;用来协调各进程或者线程工作的。信号量组可以一次性在其内…...

centos 6使用yum安装软件

1. 执行以下命令&#xff0c;查看当前操作系统 CentOS 版本。 cat /etc/centos-release返回结果如下图所示&#xff0c;则说明当前操作系统版本为 CentOS 6.9。 2. 执行以下命令&#xff0c;编辑 CentOS-Base.repo 和CentOS-Epel.repo文件。 vim /etc/yum.repos.d/CentOS-Bas…...

maven无法下载时的解决方法——笔记

右键项目然后点击创建setting.xml&#xff08;因为现在创建了&#xff0c;所以没显示了&#xff0c;可以直接点击打开setting.xml&#xff09; 然后添加 <mirror><id>nexus-aliyun</id><mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf><name…...

Java Spring Boot 开发框架

Spring Boot是一种基于Java编程语言的开发框架&#xff0c;它的目标是简化Java应用程序的开发过程。Spring Boot提供了一种快速、易于使用的方式来创建独立的、生产级别的Java应用程序。本文将介绍Spring Boot的特性、优势以及如何使用它来开发高效、可靠的应用程序。 一、简介…...

Pytorch学习记录-1-张量

1. 张量 (Tensor): 数学中指的是多维数组&#xff1b; torch.Tensor data: 被封装的 Tensor dtype: 张量的数据类型 shape: 张量的形状 device: 张量所在的设备&#xff0c;GPU/CPU requires_grad: 指示是否需要计算梯度 grad: data 的梯度 grad_fn: 创建 Tensor 的 Functio…...

paddle2.3-基于联邦学习实现FedAVg算法-CNN

目录 1. 联邦学习介绍 2. 实验流程 3. 数据加载 4. 模型构建 5. 数据采样函数 6. 模型训练 1. 联邦学习介绍 联邦学习是一种分布式机器学习方法&#xff0c;中心节点为server&#xff08;服务器&#xff09;&#xff0c;各分支节点为本地的client&#xff08;设备&#…...

nuiapp保存canvas绘图

要保存一个 Canvas 绘图&#xff0c;可以使用以下步骤&#xff1a; 获取 Canvas 元素和其绘图上下文&#xff1a; var canvas document.getElementById("myCanvas"); var ctx canvas.getContext("2d");使用 Canvas 绘图 API 绘制图形。 使用 toDataUR…...

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 Object.defineProperty(),对于这个方法&#xff0c;更多的还是停留在面试的时候&#xff0c;面试官问你vue2和vue3区别的时候&#xff0c;不免要提一提这个方法…...

Linux 磁盘管理

Linux 系统的磁盘管理直接关系到整个系统的性能表现。磁盘管理常用三个命令为&#xff1a; df、du 和 fdisk。 df df&#xff08;英文全称&#xff1a;disk free&#xff09;。df 命令用于显示磁盘空间的使用情况&#xff0c;包括文件系统的挂载点、总容量、已用空间、可用空间…...

大数据与人工智能的未来已来

大数据与人工智能的定义 大数据&#xff1a; 大数据指的是规模庞大、复杂性高、多样性丰富的数据集合。这些数据通常无法通过传统的数据库管理工具来捕获、存储、管理和处理。大数据的特点包括"3V"&#xff1a; 大量&#xff08;Volume&#xff09;&#xff1a;大数…...

【AI视野·今日Robot 机器人论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 26 Sep 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Extreme Parkour with Legged Robots Authors Xuxin Cheng, Kexin Shi, Ananye Agarwal, Deepak Pathak人类可以通过以高度动态…...

[NOIP2012 提高组] 开车旅行

[NOIP2012 提高组] 开车旅行 题目描述 小 A \text{A} A 和小 B \text{B} B 决定利用假期外出旅行&#xff0c;他们将想去的城市从 $1 $ 到 n n n 编号&#xff0c;且编号较小的城市在编号较大的城市的西边&#xff0c;已知各个城市的海拔高度互不相同&#xff0c;记城市 …...

数据库设计流程---以案例熟悉

案例名字&#xff1a;宠物商店系统 课程来源&#xff1a;点击跳转 信息->概念模型->数据模型->数据库结构模型 将现实世界中的信息转换为信息世界的概念模型&#xff08;E-R模型&#xff09; 业务逻辑 构建 E-R 图 确定三个实体&#xff1a;用户、商品、订单...

Miniconda创建paddlepaddle环境

1、conda env list 2、conda create --name paddle_env python3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 3、activate paddle_env 4、python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 5、pip install "p…...

postgresql实现单主单从

实现步骤 1.主库创建一个有复制权限的用户 CREATE ROLE 用户名login # 有登录权限的角色即是用户replication #复制权限 encrypted password 密码;2.主库配置开放从库外部访问权限 修改 pg_hba.conf 文件 &#xff08;相当于开放防火墙&#xff09; # 类型 数据库 …...

提取PDF数据:Documents for PDF ( GcPdf )

在当今数据驱动的世界中&#xff0c;从 PDF 文档中无缝提取结构化表格数据已成为开发人员的一项关键任务。借助GrapeCity Documents for PDF ( GcPdf )&#xff0c;您可以使用 C# 以编程方式轻松解锁这些 PDF 中隐藏的信息宝藏。 考虑一下 PDF&#xff08;最常用的文档格式之一…...

adb连接切换到模拟器端口

查看连接状态 adb devices出现以下情况 C:\Users\22560>adb devices List of devices attached 127.0.0.1:5555 offline emulator-5554 device可以发现我们想要连接的雷电模拟器的5555端口目前没有连接&#xff0c;只有emulator-5554被连接了&#xff0c;此时我们需要关…...

为何每个开发者都在谈论Go?

目录 一、引言Go的历史回顾关键时间节点 使用场景Go的语言地位技术社群与企业支持资源投入和生态系统 二、简洁的语法结构基本组成元素变量声明与初始化代码示例 类型推断函数与返回值代码示例输出 接口与结构体&#xff1a;组合而非继承错误处理&#xff1a;明确而不是异常小结…...

【Leetcode】 501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…...

怎样给Ubuntu系统安装vmware-tools

首先我要告诉你&#xff1a;Ubuntu无法安装vmware-tools&#xff0c;之所以这么些是因为我一开始也是这样认为的&#xff0c;vmware-tools是给Windows系统准备的我认为&#xff0c;毕竟Windows占有率远远高于Linux&#xff0c;这也可以理解。 那么怎么样实现Ubuntu虚拟机跟Wind…...

DDS信号发生器波形发生器VHDL

名称&#xff1a;DDS信号发生器波形发生器 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 在EDA平台中使用VHDL语言为工具&#xff0c;设计一个常见信号发生电路&#xff0c;要求&#xff1a; 1. 能够产生锯齿波&#xff0c;方波&#xff0c;三角波&…...

Python3操作SQLite3创建表主键自增长|CRUD基本操作

Win11查看安装的Python路径及安装的库 Python PEP8 代码规范常见问题及解决方案 Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter Python函数绘…...

B. Comparison String

题目&#xff1a; 样例&#xff1a; 输入 4 4 <<>> 4 >><< 5 >>>>> 7 <><><><输出 3 3 6 2 思路&#xff1a; 由题意&#xff0c;条件是 又因为要使用尽可能少的数字&#xff0c;这是一道贪心题&#xff0c;所以…...

python端口扫描

扫描所有端口 import socket, threading, os, timedef port_thread(ip, start, step, timeout):for port in range(start, start step):s socket.socket()s.settimeout(timeout)try:s.connect((ip, port))print(f"port[{port}] 可用")except Exception as e:# pri…...

国庆第二天

#include<th.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\ }while(0)#define PORT 6666 #define IP "192.168.2.3"//键盘输入事件 int serverkeyboard(fd_set readfds) {char buf[128] "";int sndfd -…...

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…...

2023年第二十届中国研究生数学建模竞赛总结与分享

今天是国庆节&#xff0c;祝祖国繁荣富强。正好也学习不下去&#xff0c;就想着写写博客&#xff0c;总结一下自己在参加2023年第20届中国研究生数学建模比赛的一些感受。 目录 1.基本介绍 2.比赛分享 1.基本介绍 1. 竞赛时间&#xff1a;竞赛定于2023年9月22日8:00至2023年9…...

怎样做免费外贸网站/seo排名怎么做

因为et模式需要循环读取&#xff0c;但是在读取过程中&#xff0c;如果有新的事件到达&#xff0c;很可能触发了其他线程来处理这个socket&#xff0c;那就乱了。 EPOLL_ONESHOT就是用来避免这种情况。注意在一个线程处理完一个socket的数据&#xff0c;也就是触发EAGAIN errno…...

做旅游网站的首页的图片/网站排名seo教程

题意&#xff1a; 定义f(i)∑ k∣i k^d(i≤n)&#xff0c;给出q个询问&#xff0c;每个询问询问区间[l,r]的f(i)的和。 n<1e7 d<1e18 q<5e4 可以发现f(i)是个积性函数&#xff0c;那么我们就可以欧拉筛 O(n) 预处理出f(i)&#xff0c;然后做个前缀和就行了。 f(i)分为…...

网站建设的实训报告/自己如何制作网站

目 录 摘 要 I Abstract II 1 前言 1 1.1 研究背景及意义 1 1.2 国内外研究现状 2 1.3 本文研究思路与结构 3 2 系统开发技术介绍 4 2.1 Java语言 5 2.2 Spring框架简介 6 2.3 Spring Boot 框架简介 6 2.4 MyBatis 框架简介 7 2.5 开发环境 8 3 系统需求分析 9 3.1 需求分析 9 …...

杭州做网站哪里好/武汉seo和网络推广

•参考资料 [1]:挑战程序设计竞赛&#xff08;第二版&#xff09; [2]:http://www.hankcs.com/program/m-n-recursive-division.html(注意看评论) •自学笔记 •对参考资料[2]的理解 定义dp[ i ][ j ] : 将 j 个物品划分成 i 组的总方案数 •1.对“我们定义 n 的 m 划分具体为一…...

网页设计基础教程视频教程/seo优化裤子关键词

qt中有时候使用new后并没有使用delete&#xff0c;原因是 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 #include "mainwindow.h" #include <QApplication> #include <QTextCodec> #include <QLabel> int main(int argc, char *argv[…...

wordpress读取其他数据库/seo综合查询站长工具关键词

17、isset、empty、is_null的区别 isset 判断变量是否定义或者是否为空 变量存在返回ture&#xff0c;否则返回false变量定义不赋值返回falseunset一个变量&#xff0c;返回false变量赋值为null&#xff0c;返回falseempty&#xff1a;判断变量的值是否为空&#xff0c;能转换为…...