本章内容为数据结构学习,参照B站up"蓝不过海呀"
目录
[父节点 子结点](#父节点 子结点)
[兄弟结点 堂兄弟](#兄弟结点 堂兄弟)
[祖先节点 子孙节点](#祖先节点 子孙节点)
[定义一 原始定义](#定义一 原始定义)
[定义二 递归定义](#定义二 递归定义)
[深度 高度](#深度 高度)
[度为m的树 m叉树](#度为m的树 m叉树)
[有序树 无序树](#有序树 无序树)
[路径 路径长度](#路径 路径长度)
[节点数 边数 度数](#节点数 边数 度数)
[二叉树 Binary Tree](#二叉树 Binary Tree)
树结构的引入
前面学习的线性表、栈、队列都属于线性结构 :数据元素之间是"一个接一个"的关系,除首尾外,每个元素只有一个前驱和一个后继。但现实中有很多关系并不是线性的,而是层次关系。
计算机里的树结构就像一株倒过来的树

树的基本概念
节点
结点:树中的一个独立单元。包含一个数据元素及若干指向其子树的分支,如图中的A、B、C、D等
根节点
根节点:树中最上层的唯一结点。如A
父节点 子结点
父节点:又称双亲结点
子结点:又称孩子节点
结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲
如:B、C、D是A的子节点 ;A是B、C、D的父节点
同理:对于B而言,其子节点为:E、F;对I结点而言,其子结点为J、K
根节点无父结点,叶节点无子节点
边
边:节点与节点相连的线段。
上边说根节点无父结点,两个结点对一个边。
那么一个树有N个结点,则存在N-1个边
兄弟结点 堂兄弟
兄弟节点:同一个双亲的结点称作:兄弟节点
如结点B、C、D之父节点皆为A,那么B、C、D之间互为兄弟节点
再者E同F、J同K之间也互为兄弟节点
祖先节点 子孙节点
祖先节点:从根到该结点所经分支上的所有结点
如:A→C→G→H
A为C、G、H的祖先节点;反之,C、G、H均为A的子孙节点
再者:A→B→F,A→D→I→J等,皆如此
对于A结点而言,树上除它本身外的所有结点都是它的子孙节点
叶节点
叶节点:又称叶子、叶子节点
没有子节点的结点叫做叶节点

树的两个定义
定义一 原始定义
树是由n个结点构成的有限集合
n=0:空树
n>=0:有且仅有一个根节点
其余可以不断细分为m个互不相交的子集 ,每个子集也是树,这些子集称为根节点A的子树

一棵树,有且仅有一个根节点
定义二 递归定义
一棵树可以不断细分为m个互不相交的子集 ,每个子集也是树,这些子集称为根节点A的子树

我们可以把子树从根节点A中分离出来。比如把左红色部分抽出来
则B为E、F的根节点,节点数n=3。其中E、F亦可分为两个不相交的子树

所以从树中分离出来的子树本身也是一种树,树是可以递归下去的

术语
层数
我们根据根节点(祖先节点)-子节点-子孙节点可以对树进行分层

深度 高度
深度:一个结点的深度表示从上往下,它所在的层次。
高度:一个结点的高度表示以它为根的子树的层数
对于树(包含子树)而言,层数=深度=高度

结点的度
节点的度:该节点的子节点的个数
如:A的度为3;B的度为2;D的度为1;E、F、H、J、K的度为0
叶结点
叶节点的第二个定义:度为0的结点叫叶节点

分支节点
度>0的结点叫分支节点
如:A、B、C、D、G、I

树的度
树中结点最大的度数
如下图的树的度为3,我们也成这棵树叫度为3的树

度为m的树 m叉树
度为m的树:这棵树的度为几,那这棵树就叫做度为几的树,其名字随着度的改变而改变
m叉树:树里面最多有m个分支。即树的度不得超过m
- 共同点:树的结点最多为m
- 不同点:度为m的树至少有一个结点的度等于m;m叉树的所有结点都可以小于m,甚至为0(空树)

有序树 无序树
有序树:各结点的子树从左到右有次序、不能互换,叫做有序树
无序树:不满足上式的叫做无序树

路径 路径长度
两个节点的路径就是从上到下经过的节点序列
路径长度:经过的边数是路径的长度

森林
由m(m>=0)棵互补相交的树所构成的集合

森林也可以变为树

树的性质
节点数 边数 度数
节点数n=边数+1=所有结点的度数+1
一条边就是一个度
节点数可表示:或
边数可表示:或
节点i的度可表示:或
或
树T的度可表示:
那么对于度为m的树T而言,即对于
节点数:
所有结点度数:
我们可以这样理解:n个节点假设都有父节点,那么必然与其父节点存在n条边。但根节点不存在父节点,自然不存在其边,故整个树仅有
条边。根据前面的,对于一个结点而言,它有几个子结点,就有几条边,就有几个度。那么除开根结点外存在
条边,那么也就存在
个度,如图:将这
个度相加后得7,注意到再与根节点A的度相加得10,再加1为节点数11
那么:n=各结点度数之和+1
下图中:度deg简作m

对于这个,我们也可以理解为:这棵树=根节点+森林的形式,森林即"人类社会",根结点为"人神",统计完人类社会后再加上人神这个1即可。
m叉树每层最多节点数
m叉树每层最多节点数:
我们要第三层的节点数最多,那么第二层的节点数也必须达到最多,在前面的基础上,我们要第三层的节点数真的最多,那么应道填满第三层
此性质同时满足于:m叉树与度为m的树

高h的m叉树最多结点数
对于m叉树和度为m的树而言,都是成立的
对于高度为h的m叉树,我们已经知道了其每一层的最多结点数为。对于树而言,高度=深度=层数,那么第h层最多结点数为
那么自第1层到第h层各结点分别为:、
、...
。我们发现这是一个等比数列,公比为
,根据等比数列求和公式
,带入得:
高h的m叉树最少结点数
因为m叉树可以使所有结点度小于m,则高度为h的m叉树最少可以有h个结点

高h度m的树最少结点
我们考虑树的最后一层存在m个结点即可,结点最少为:

n结点m叉树最小高度
同理,满结点的情况下,m叉树性质=度为m的树
如图:设最小高度为,最小高度不能比
小,也不能比
大
情况一:
当第h层的结点数仅为1时,高度h存在最小值,其总结点数
情况二:
当第h层的结点数填满时,高度h存在最大值,其总结点数
那么:
方便计算,略去+1
化简得:
两边取对数:其中
,
则左右取整后仅相差1,因为左边<=h,
即

n结点m叉树最大高度
为n
一棵树的结点越少,那么这棵树就越高

n结点度m数=树最大高度

树的性质总结
满结点的情况下(或 度个数越多越好的情况下),m叉树性质=度为m的树性质

二叉树 Binary Tree
二叉树是应用的最广泛的一种树形结构

二叉树的定义
- 由n个结点组成的有限集合
- n=0时,为空二叉树
- n>0时,二叉树由根+互不相交的左子树 和右子树组成(左右子树也是二叉树)


二叉树和度为二的树
|------------|-------------|
| 二叉树 | 度为二的树 |
| 所有结点都可以小于2 | 至少有一个节点的度为2 |
| 有序树,严格区分左右 | 无序树,不区分左右 |
二叉树≠度为2的树≠二叉树

二叉树的基本形态
二叉树的基本形态有五个:空二叉树,根、根+左子树、根+右子树、根+左右子树
任何二叉树都可以由以上五种复合而来
特殊的二叉树
满二叉树
满二叉树就是最"丰满"的二叉树
特征:
所有分支节点都有两个子节点
所有叶节点都在最后一层
或者
满二叉树的结点的度仅有0或2两种情况

完全二叉树
除最后一层外其他层数的结点必须是满的 ;且最后一层可以不满,但必须从左到右连续排列
若最后一层满了,那这颗完全二叉树也是一颗满二叉树


二叉树的性质
结点数之间的关系

设
度为0的结点数 为:
度为1的结点数 为:
度为2的结点数 为:
该二叉树的结点数:
根据树的结点数的性质,结点数n=所有结点度数之和+1
联立:
二叉树每层最多结点数
根据前面的"m叉树每层最多结点数"为:
令
,得:
再记二叉树的层数为
,则
同理,我们可以进一步得出二叉树最多有多少个结点
根据前面的,h层的m叉树最多有
个
令
,得:
h层的二叉树最多有
个结点
当二叉树为满二叉树时,满二叉树有
个结点
完全二叉树的性质
编号性质
首先我们对于一个完全二叉树进行编号。编号的规则是:从上到下,从左到右依次对结点编号为
一、
设对第i个结点,其左孩子的编号为:
;右孩子的编号为:
;父亲为
(下取整)
二、
最后一个分支节点(并非仅指整棵树的末分支节点)的编号为:整个树的编号(或者叫与它相对应的最后一个结点的编号)除以2,即:
既然是最后一个分支节点,那意思等价为:这个结点之后(不包含自己)的所有结点都是叶节点
即:满足
,的结点都是分支节点,反之皆为叶节点


度为1的性质
一个完全二叉树,度为1的结点有且仅有1个或0个

叶节点只可能出现在最后两层
完全二叉树叶节点只可能出现在最后两层

具有n个结点的完全二叉树的高度
具有n个结点的完全二叉树的高度**
或
**
等价:n个结点的二叉树的最小高度

我们设这一完全二叉树的高度为h
情况一:明显,不能存在,这说明要想使树的高度为h,末层就必须至少存在一个结点,那么对于上面
层的结点个数为:
,再加上第h层的这一个,则有:
情况二:明显,不能存在,这说明想使树的高度为h,末层的结点最多填满而不能继续开辟下一层。那么这时这颗完全二叉树就是一颗满二叉树,则总结点数最多为:
综上有: ①
解法一:将①上式变形为:
进一步:
两边取对数得:
即:
向上取整为:
解法二:将①式变形为:
两边取对数得:
即:
向下取整为:
根据取整函数的平移性,得:
的d