【树与二叉树】树与二叉树的概念及结构--详解介绍
📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:数据结构
🎯长路漫漫浩浩,万事皆有期待
文章目录
- 1.树概念及结构
- 1.1 树的概念:
- 1.2 树的相关概念
- 1.3 树的表示
- 1.3 树在实际中的运用
- 2.二叉树概念及结构
- 2.1 二叉树的概念
- 2.2 特殊的二叉树
- 2.2.1 满二叉树:
- 2.2.2 完全二叉树:
- 2.3 二叉树的性质
- 2.4 二叉树的概念选择题
- 2.5 二叉树的存储结构
- 2.5.1. 顺序存储:
- 2.5.2. 链式存储:
- 3.总结:
学习顺序
树->二叉树->搜索二叉树->归并排序->M叉多叉平衡搜索树 (B树和B+树)
1.树概念及结构
1.1 树的概念:
树
是一种非线性的数据结构,它是由 n (n>=0) 个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下。
1.有一个特殊的结点,称为根结点,根节点没有前驱结点
2. 除根节点外,其余结点被分为 M (M>0) 个互不相交的集合 T1、T2 … 、Tm,其中每一个集合 Ti (1<=i<=m) 又是一棵结构与树类似的子树,每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
3. 因此,树是递归定义的
注意
:树形结构中,子树之间不能有交集,否则就不是树形结构
▶ 子树是不相交的
▶ 除了根节点外,每个节点有且仅有一个父节点
▶ 一棵 N 个节点的树有 N-1 条连
1.2 树的相关概念
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
10.堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I 互为兄弟节点
11.节点的祖先:从根到该节点所经分支上的所有节点;如上图:A 是所有节点的祖先
12.子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是 A 的子孙
13.森林:由 m(m>0) 棵互不相交的树的集合称为森林,并查集就是一个森林
1.3 树的表示
树结构相对线性表就比较复杂了,要存储表示起来比较麻烦,既要保存值域,也要保存结点和结点之间的关系。实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。
注意
:对于树的定义其实并不好定义,因为其中有许多未知的因素
1、除非明确说明树的度是多少,比如树的度是 6
struct TreeNode
{int data;//这种结构其实是很浪费的,因为最大的度是6,但往下可能并没有那么多struct TreeNode* subs[6];//指针数组
}
2、如果没有说明树的度是多少,可以使用顺序表存储
struct TreeNode
{int data;SeqList subs;//顺序表中存储的是节点的指针//vector<struct TreeNode*>subs;//在C++学了模板后可以这样定义
}
3、双亲表示法
struct TreeNode
{int data;struct TreeNode* parent;
}
4、左孩子右兄弟表示法 (比较实用)
typedef int DataTpye;
struct Node
{struct Node* firstChild1;//第一个孩子节点(如有多个孩子,那么只指向最左边的)struct Node* pNextBrother;//指向下一个兄弟节点DataType data;//节点中的数据域
}
1.3 树在实际中的运用
表示文件系统的目录树结构
2.二叉树概念及结构
2.1 二叉树的概念
一棵二叉树是节点的一个有限集合,该集合:
1、或者为空
2、由一个根节点加上两棵别称为左子树和右子树的二叉树组成
1.二叉树不存在度大于 2 的结点
2.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意
:对于任意的二叉树都是由以下几种情况复合而成的:
2.2 特殊的二叉树
2.2.1 满二叉树:
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 K,且结点总数是 2^k - 1,则它就是满二叉树。
2.2.2 完全二叉树:
完全二叉树的前 k - 1 层都满的,第 k 层不一定满(这就意味着满二叉树是完全二叉树,但完全二叉树不一定是满二叉树),但是从最后一层从左到右必须是连续的,也就是说完全二叉树中度为 1 的节点最少 0 个,最多 1 个。完全二叉树是效率很高的数据结构,是由满二叉树而引出来的。对于深度为 K 的,有 n 个结点的二叉树,且每个结点都与深度为 K 的满二叉树中编号从 1 至 n 的结点 一一 对应称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。
▶ 满二叉树的节点个数是等比求和
2^0 + 2^1 + 2^2 + … 2^(h-1)
利用公式所以满二叉树的节点个数就是 2^h - 1
▶ 完全二叉树的节点个数
最多: 2^h - 1 这是满二叉树
最少:2^(h-1) - 1 + 1 -> 2^(h-1)
2(^h-1) - 1 这是前 k-1 层节点的个数,+1 则是第 k 层至少一个
2.3 二叉树的性质
1.若规定根节点的层数为 1,则一棵非空二叉树的第 i 层上最多有 2^(i-1)
个结点
2.若规定根节点的层数为 1,则深度为 h 的二叉树的最大结点数是2^h - 1
3.对任何一棵二叉树, 如果度为 0 其叶结点个数为 n₀, 度为 2 的分支结点个数为 n₂,则有 n₀= n₂+1
4.若规定根节点的层数为 1,具有 n 个结点的满二叉树的深度为 h = log₂(n+1)
ps:log₂(n+1)是 log 以 2 为底, n+1 的对数
5.对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对于序号为 i 的结点有:
▶ 若 i>0,i 位置节点的双亲序号:(i-1)/2;i=0,i 为根节点编号,无双亲节点
▶ 若 2i+1<n,左孩子序号:2i+1,2i+1>=n 否则无左孩子
▶ 若 2i+2<n,右孩子序号:2i+2,2i+2>=n 否则无右孩子
2.4 二叉树的概念选择题
1、某二叉树共有 399 个结点,其中有 199 个度为 2 的节点,则该二叉树中的叶子节点数为( )
A. 不存在这样的二叉树
B. 200
C. 198
D. 199
- 分析:这里的叶子节点就是度为 0 的节点,已知二叉树中度为 2 的节点为 199 个,则度为 0 的节点等于度为 2 的节点 +1,所以选择 B 选项
2、下列数据结构中,不适合采用顺序存储结构的是( )注意此题可以先了解下面的二叉树的存储结构在来做
A. 非完全二叉树
B. 堆
C. 队列
D. 栈
- 分析:顺序结构存储就是使用数组来存储,它只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。数组只适合存储完全二叉树或者满二叉树。
所以选择 A 选项
3、在具有 2n 个节点的完全二叉树中,叶子节点个数为( )
A. n
B. n+1
C. n-1
D. n/2
- 分析:
假设度为 0 的个数是 x0,度为 2 的个数是 x2,度为 1 的个数是 x1,那么:
▶ x0 + x1 + x2 = 2n
▶ x0 = x2 + 1
由 x0 = x2 + 1 得到 x2 = x0 - 1
所以 x0 + x1 + x2 = 2n --> x0 + x1 + x0 - 1 = 2n --> 2x0 + x1 - 1 = 2n
又因为完全二叉树中度为 1 的节点最少 0 个,最多就只有 1 个,所以 x1 = 0 or 1
所以 2x0 + x1 - 1 = 2n 就有 2 种情况:
▶ 2x0 + 0 - 1 = 2n
▶ 2x0 + 1 - 1 = 2n
当 x1 = 0 时,x0为小数,显然不可能;当 x1 = 1 时满足,所以选择 A 选项
4、一棵完全二叉树的节点数为 531 个,那么这棵树的高度为( )
A. 11
B. 10
C. 8
D. 12
- 分析:
假设完全二叉树的高度是 h,那么:最多有 2^h-1 个节点;最少有 2^(h-1) 个节点
▶ h = 11 时:最多 2047;最少 2014,所以不合理
▶ h = 10 时:最多 1023;最少 512,所以合情合理
▶ h = 8 时:最多 255;最少 128,所以不合理
▶ h = 12 时:最多 4095;最少 2048,所以不合理
所以选择 B 选项
5、一个具有 767 个节点的完全二叉树,其叶子节点个数为 ( )
A. 383
B. 384
C. 385
D. 386
- 分析:此题类似于第 3 题
假设度为 0 的个数是 x0,度为 2 的个数是 x2,度为 1 的个数是 x1,那么:
▶ x0 + x1 + x2 = 767
▶ x0 = x2 + 1
由 x0 = x2 + 1 得到 x2 = x0 - 1
所以 x0 + x1 + x2 = 767 同 x0 + x1 + x0 - 1 = 767 同 2x0 + x1 - 1 = 767
完全二叉树中度为 1 的节点最少 0 个,最多就只有 1 个
所以 x1 = 0 or 1
所以 2x0 + x1 - 1 = 767 就有 2 种情况:
▶ 2x0 + 0 - 1 = 767
▶ 2x0 + 1 - 1 = 767
当 x1 = 0 时,满足条件;当 x1 = 1 时,不满足条件,所以选择 B 选项
2.5 二叉树的存储结构
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构:
2.5.1. 顺序存储:
顺序结构存储就是使用数组来存储,它只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实使用中只有堆才会使用数组来存储
,二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。如下图所见,数组只适合存储完全二叉树或者满二叉树。
怎么表示二叉树的值在数组位置中父子下标关系的:
左孩子和右孩子
leftchild = parent * 2 + 1
rightchild = parent * 2 + 2
父亲 (这里无论是左孩子还是右孩子都适用于以下公式)
parent = (child - 1) / 2
2.5.2. 链式存储:
二叉树的链式存储结构是指用链表来表示一棵二叉树,即用链表来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链的存储地址。
链式结构又分为二叉链和三叉链,现阶段本篇文章我们只了解二叉链,在以后的文章内写到高阶数据结构时,如红黑树等会用到三叉链。
二叉链只能通过父亲找孩子,类似于单向链表;而三叉链不仅能通过父亲找孩子,还能通过孩子找父亲,类似于双向链表。
typedef int BTDataType;
//二叉链
struct BinaryTreeNode
{struct BinaryTreeNode* _pLeft; //指向当前节点的左孩子struct BinaryTreeNode* _pRight; //指向当前节点的右孩子 BTDataType _data; //当前节点的值域
}//三叉链
struct BinaryTreeNode
{struct BinaryTreeNode* _pParent; //指向当前节点的父亲struct BinaryTreeNode* _pLeft; //指向当前节点的左孩子struct BinaryTreeNode* _pRight; //指向当前节点的右孩子BTDataType _data; //当前节点的值域
}
3.总结:
今天我们认识并学习了树与二叉树的相关概念,对树与二叉树有了一个整体的认识。并且对二叉树的两种存储结构也有了一定的了解。下一篇博客我们将学习二叉树顺序结构和实现以及堆的概念及结构。希望我的文章和讲解能对大家的学习提供一些帮助。
当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~
相关文章:

【树与二叉树】树与二叉树的概念及结构--详解介绍
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 文章目录1.树概念及结构1.1 树…...

Spring Boot集成RocketMQ实现普通、延时、事务消息发送接收、PULL消费模式及开启ACL | Spring Cloud 30
一、前言 在前面我们通过以下章节对RocketMQ有了基础的了解: docker-compose 搭建RocketMQ 5.1.0 集群(双主双从模式) | Spring Cloud 28 docker-compose 搭建RocketMQ 5.1.0 集群开启ACL权限控制 | Spring Cloud 29 现在开始我们正式学习…...

人人都能看懂的Spring源码解析,Spring如何解决循环依赖
人人都能看懂的Spring源码解析,Spring如何解决循环依赖原理解析什么是循环依赖循环依赖会有什么问题?如何解决循环依赖问题的根本原因如何解决为什么需要三级缓存?Spring的三级缓存源码走读Spring的三级缓存提前暴露getSingleton方法总结往期…...

Linux上搭建Discuz论坛
一.准备工作 1.下载php*,mariadb-server 2.上传Discuz3.5压缩包并解压 二.搭建过程 基于redhat 9 版本和Discuz3.5,php8.0,mariadb10.5演示 一.准备工作 1.下载php*,mariadb-server [rootredhat9 aaa]# yum install -y php*…...

【蓝桥杯专题】 树状数组(C++ | 洛谷 | acwing | 蓝桥)
菜狗现在才开始备战蓝桥杯QAQ 文章目录【蓝桥杯专题】 (C | 洛谷 | acwing | 蓝桥)什么是线段数组??1264. 动态求连续区间和数星星线段树AcWing 1270. 数列区间最大值PPPPPPP【蓝桥杯专题】 (C | 洛谷 | acwing | 蓝桥) 什么是…...

QCefView编译配置(Windows-MSVC)(11)
QCefView编译配置(Windows-MSVC) 文章目录QCefView编译配置(Windows-MSVC)1、概述2、准备工作3、添加环境变量4、更换cef源码版本5、CMake构建6、Visual Studio编译7、安装编译后的文件8、验证编译结果更多精彩内容👉个…...
Token原理
Q:分布式场景下如何生成token以及使用token的流程: 在分布式场景下,可以采用以下方式生成 token 和进行权限认证: 1. 生成 token: 使用JWT(JSON Web Token)生成 token。JWT 是一种基于 JSON …...

③【Java组】蓝桥杯省赛真题 持续更新中...
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 蓝桥杯真题--持续更新中...一、错误票据题目描…...

linux实验之shell编程基础
这世间,青山灼灼,星光杳杳,秋风渐渐,晚风慢慢 shell编程基础熟悉shell编程的有关机制,如标准流。学习Linux环境变量设置文件及其内容/etc/profile/etc/bashrc/etc/environment~/.profile~/.bashrc熟悉编程有关基础命令…...

C语言小程序:通讯录(静态版)
哈喽各位老铁们,今天给大家带来一期通讯录的静态版本的实现,何为静态版本后面会做解释,话不多说,直接开始!关于通讯录,其实也就是类似于我们手机上的通讯录一样,有着各种各样的功能,…...
写CSDN博客两年半的收获--总结篇
👨💻作者简介:练习时长两年半的java博主 🎟️个人主页:君临๑ ps:点赞是免费的,却可以让写博客的作者开心好几天😎 不知不觉间,在csdn写博客也有两年半的时间了&#x…...

中科亿海微FPGA应用(一、点灯)
1.软件: https://download.csdn.net/download/weixin_41784968/87564071 需要申请license才能使用:软件试用申请_软件试用申请_中科亿海微电子科技(苏州)有限公司 2.开发板: 芯片EQ6HL45,42.5k LUT。 3…...
ElasticSearch - SpringBoot整合ES:实现搜索结果排序 sort
文章目录00. 数据准备01. Elasticsearch 默认的排序方式是什么?02. Elasticsearch 支持哪些排序方式?03. ElasticSearch 如何指定排序方式?04. ElasticSearch 如何按照相关性排序?05. ElasticSearch 查询结果如何不按照相关性排序…...

IDEA的全新UI可以在配置里启用了,快来试试吧!
刚看到IDEA官方昨天发了这样一条推:IDEA的新UI可以在2022.3版本上直接使用了!开启方法如下:打开IDEA的Setting界面,在Appearance & Behavior下有个被标注为Beta标签的New UI菜单,具体如下图:勾选Enable…...
第九章 镜像架构和规划 - 备份处于活动状态时自动进行故障转移
文章目录第九章 镜像架构和规划 - 备份处于活动状态时自动进行故障转移备份处于活动状态时自动进行故障转移备份不活动时的自动故障转移对各种中断场景的镜像响应响应主要中断场景的自动故障转移第九章 镜像架构和规划 - 备份处于活动状态时自动进行故障转移 备份处于活动状态…...

Barra模型因子的构建及应用系列七之Liquidity因子
一、摘要 在前期的Barra模型系列文章中,我们构建了Size因子、Beta因子、Momentum因子、Residual Volatility因子、NonLinear Size因子和Book-to-Price因子,并分别创建了对应的单因子策略,其中Size因子和NonLinear Siz因子具有很强的收益能力…...

走进二叉树的世界 ———性质讲解
二叉树的性质和证明前言1.二叉树的概念和结构特殊的二叉树:二叉树的性质前言 本篇博客主要讲述的是有关二叉树的一些概念,性质以及部分性质的相关证明,如果大伙发现了啥错误,可以在评论区指出😘😘 1.二叉树…...

【SSM】Spring + SpringMVC +MyBatis 框架整合
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ SSM框架整合一、导入相关依赖二、配置web.xml文…...

【算法基础】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解
博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 算法 ;该专栏专注于蓝桥杯和ACM等算法竞赛🔥近期目标&…...

第二十三天01MySQL多表查询与事务
目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.2.1 语法 1.2.2 案例演示 1.3 外连接 1.3.1 语法 1.3.2 案例演示 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 1.5.1 介…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...