树和二叉树的概念以及结构

目录

一、树概念及结构

1.1 树的概念

1.2 树的相关概念

1.3 树的表示

1.4 树在实际中的应用

二、二叉树概念及结构

2.1 概念

2.2 特殊的二叉树

2.3 二叉树的性质

2.4 二叉树的存储结构


梦想就是梦里想做的事,醒来后努力去实现。


一、树概念及结构

1.1 树的概念

树是一种 非线性 的数据结构,它是由 n n>=0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的
(1)有一个 特殊的结点,称为根结点 ,根节点没有前驱结点
(2)除根节点外, 其余结点被分成 M(M>0) 个互不相交的集合 T1 T2 …… Tm ,其中每一个集合 Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有 0 个或多个后继
(3)因此,树是 递归 定义 的。

 注意:(1)树形结构中,子树之间不能有交集,否则就不是树形结构。【例如上图,E和F就不可以连接】(2)子树是不相交的(3)除了根节点外,每个结点有且只有一个父节点(4)一棵N个结点的树有N-1条边。

1.2 树的相关概念

节点的度 :一个节点含有的子树的个数称为该节点的度; 如上图: A 的为 6
叶节点或终端节点 :度为 0 的节点称为叶节点; 如上图: B C H I... 等节点为叶节点
非终端节点或分支节点 :度不为 0 的节点; 如上图: D E F G... 等节点为分支节点
双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图: A B 的父节点
孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; 如上图: B A 的孩子节点
兄弟节点 :具有 相同父节点 的节点互称为兄弟节点; 如上图: B C 是兄弟节点
树的度 :一棵树中,最大的节点的度称为树的度; 如上图:树的度为 6
节点的层次 :从根开始定义起,根为第 1 层,根的子节点为第 2 层,以此类推;
树的高度或深度 :树中节点的最大层次; 如上图:树的高度为 4
堂兄弟节点 双亲在同一层 的节点互为堂兄弟;如上图: H I 互为兄弟节点
节点的祖先 :从根到该节点所经分支上的所有节点;如上图: A 是所有节点的祖先
子孙 :以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是 A 的子孙
森林 :由 m m>0 )棵互不相交的树的集合称为森林
P和Q的最近公共祖先是J;K和F的最近公共祖先是F。Q的祖先可以认为包含Q。

1.3 树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了, 既然保存值域,也要保存结点和结点之间 的关系 ,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法

 代码如下:

//孩子兄弟表示法
struct TreeNode
{struct Node* firstChild1; // 第一个孩子结点struct Node* pNextBrother;//下一个兄弟DataType data;
};

 

 没有下一个兄弟或者孩子,就是NULL。横着看就像一个单链表。

1.4 树在实际中的应用

表示文件系统的目录树结构

二、二叉树概念及结构

2.1 概念

一棵二叉树是结点的一个有限集合,该集合 :
1. 或者为空
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

1. 二叉树不存在度大于 2 的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:

2.2 特殊的二叉树

1. 满二叉树 :一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是 说,如果一个二叉树的层数为K ,且结点总数是2^k-1,则它就是满二叉树。
2. 完全二叉树 :完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为 K 的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为 K 的满二叉树中编号从 1 n 的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。【前N-1层都是满的,最后一层不满,但是最后一层从左往右是连续的】

(1) 可以用数组存储二叉树。【 树一个层次一个层次的放到数组中】【物理结构:实际上在内存中怎么存储。逻辑结构:是虚拟的,使我们想象的】

(2)父子间下标关系计算公式:

leftchild = parent*2+1;rightchild=parent*2+2;leftchild+1=rightchild【反过来就可以通过孩子计算父亲的下标】parent = (child-1)/2

2.3 二叉树的性质

1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 i 层上最多有2^(i-1)个结点.
2. 若规定根节点的层数为 1 ,则 深度为 h 的二叉树的最大结点数是2^h-1.
3. 对任何一棵二叉树 , 如果度为 0 其叶结点个数为 n0 , 度为 2 的分支结点个数为n2  , 则有n0 =n2+ 1
4. 若规定根节点的层数为 1 ,具有 n 个结点的满二叉树的深度 h=log2   (n+1 (ps:
log 2为底,n+1 为对数 )
5. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对 于序号为i 的结点有:
1. i>0 i 位置节点的双亲序号: (i-1)/2 i=0 i 为根节点编号,无双亲节点
2. 2i+1<n ,左孩子序号: 2i+1 2i+1>=n 否则无左孩子
3. 2i+2<n ,右孩子序号: 2i+2 2i+2>=n 否则无右孩子
选择题:
1.下列数据结构中,不适合采用顺序存储结构的是( A)
A 非完全二叉树
B
C 队列
D
2. 在具有 2n 个结点的完全二叉树中,叶子结点个数为(A)
A n
B n+1
C n-1
D n/2
度为0的有N0个,度为1的有N1个,度为2的有N2个。N1+N2+N0=2n;因为N0=N2+1所以N1+N0-1+N0=2n;因为N1的个数为0或者为1. N1+N0-1+N0=2n,这个式子要想成立,只能为1,所以选择A
3. 一棵完全二叉树的节点数位为 531 个,那么这棵树的高度为( B)
A 11
B 10
C 8
D 12
满级二叉树节点数2^k-1.9层2^9-1=511, 10层是1023.  则10层的完全二叉树,最少为512,最多是1023.所以选B
4. 一个具有 767 个节点的完全二叉树,其叶子节点个数为(B)
A 383
B 384
C 385
D 386
可以用第二题的思路

2.4 二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
1. 顺序存储
顺序结构 存储就是使用 数组来存储 ,一般使用数组 只适合表示完全二叉树 ,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺 序存储在物理上是一个数组,在逻辑上是一颗二叉树。
2. 链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{struct BinTreeNode* _pLeft; // 指向当前节点左孩子struct BinTreeNode* _pRight; // 指向当前节点右孩子BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{struct BinTreeNode* _pParent; // 指向当前节点的双亲struct BinTreeNode* _pLeft; // 指向当前节点左孩子struct BinTreeNode* _pRight; // 指向当前节点右孩子BTDataType _data; // 当前节点值域
} 

    

 

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

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

相关文章

高阶组件/react组件复用

也可以用children模式 优化 高阶组件 组件名称相同设置组件名字 效果 解决props丢失 setstate是异步更新的 推荐语法 页面更新完后的回调函数 组件性能优化 1. 2.

Github下载Failed to connect to github.com port 443: Timed out

方法一&#xff1a; 使用ssh下载的方式 方法二 使用github加速网站 https://gitclone.com ,用命令行&#xff1a; git clone https://http://gitclone.com/http://github.com/xxx/yyy 参考链接 github克隆失败提示“443&#xff1a;Timed out”怎么解决&#xff1f; - 知乎

mysql练习---多表连接查询

-- 创建部门表 create table if not exists dept3( deptno varchar(20) primary key , -- 部门号 name varchar(20) -- 部门名字 ); -- 创建员工表 create table if not exists emp3( eid varchar(20) primary key , -- 员工编号 ename varchar(20), -- 员工名字 age int, -- 员…

redis操作问题

使用redisTemplate 往set集合中批量添加值 # 第一种办法就是for循环&#xff0c;每次进行setfor (int i 0; i < 1000000; i) {redisTemplate.opsForSet().add("key",i);} # 第二中办法就是使用HashSet批量添加数据Set set new HashSet<>();for (int i 1…

计算机网络概述(三)

常见的计算机网络体系结构 OSI体系结构&#xff1a; 物理层→数据链路层→网络层→运输层→会话层→表示层→应用层 TCP/IP体系结构&#xff1a; 网络接口层→网际层→运输层→应用层 一般用户的设备都有TCP/IP协议用于连接因特网&#xff0c;TCP/IP的网络接口层并没有规定使用…

培训报名小程序实战开发

目录 1 需求描述2 原型绘制2.1 首页2.2 报名列表页2.3 报名页2.4 支付页面2.5 支付成功页面2.6 我的页面2.7 我的报名页面2.8 报名详情页面 3 数据源设计4 数据源开发5 创建模型应用6 录入测试数据7 创建自定义应用8 创建页面总结 经常有人问&#xff0c;低代码学习容易么&…

HarmonyOS学习路之开发篇—数据管理(融合搜索)

融合搜索概述 HarmonyOS融合搜索为开发者提供搜索引擎级的全文搜索能力&#xff0c;可支持应用内搜索和系统全局搜索&#xff0c;为用户提供更加准确、高效的搜索体验。 基本概念 全文索引 记录字或词的位置和次数等属性&#xff0c;建立的倒排索引。 全文搜索 通过全文索引进…

微服务之服务器缓存

Informal Essay By English In the difficult employment situation, we need to set a good goal and then do our own thing 参考书籍&#xff1a;“凤凰架构” 进程缓存&#xff08;Cache&#xff09; 缓存在分布式系统是可选&#xff0c;在使用缓存之前需要确认你的系统…

Redis - 附近商铺、用户签到、UV统计

文章目录 附近商铺、用户签到、UV统计一、附近商铺1.1 GEO数据结构1.2 导入店铺数据到GEO1.3 实现附近商户功能 二、用户签到2.1 BitMap2.2 签到功能2.3 统计连续签到2.3.1 分析2.3.2 代码实现 三、UV统计3.1 HyperLogLog用法3.2 测试百万数据的统计 附近商铺、用户签到、UV统计…

系统架构设计师-软件工程(3)

一、软件系统建模 1、结构化建模方法 结构化建模方法是以过程为中心的技术&#xff0c;可用于分析一个现有系统以及定义新系统的业务需求。结构化建模方法所绘制的模型称为数据流图&#xff08;DFD&#xff09;。对于流程较为稳定的系统可考虑结构化建模方法。 2、信息工程建模…

简单详细的MySQL数据库结构及yum和通用二进制安装mysql的方法

目录 mysql体系结构mysql的安装方法一&#xff0c;yum安装1&#xff0c;首先下载一个网络源仓库&#xff1a;2&#xff0c;然后安装 mysql-community-server3&#xff0c;启动mysqld 服务4&#xff0c;然后登录数据库5&#xff0c;初次登录要设置密码&#xff0c;而且不能太简单…

【ROS】TF2坐标转换及实战示例

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 文章目录 0.ROS中的坐标转换消息包0.1 geometry_msgs/TransformStamped0.2 geometry_msgs/PointStamped1.静态坐标转换1.1导入所需功能包1.2发布方实现1.3 …