今天我们来讲一个新的内容,树!我们呢先来看一看基础介绍(二叉树)
1.树的概念
什么是树?
生活中,树很常见,有各种各样的树。
从上面几幅图来看,树的构成几乎是一样的:树根、躯干、树叶...
在程序设计中也有这么一种 特殊 的结构:树。
程序中的树跟生活中的树不太一样。
什么是树?
那么程序中的树是什么样呢?
上图中蓝色部分是程序中树的图示,不难发现,它跟实际的树也有一些 相似之处:
画出的绿色部分,像松树的伞帽形状
用带箭头的线连接所有蓝色圆圈,像实际树的树枝、躯干一样。
所以,程序中的树其实是 模仿 生活中的树建立的 特殊程序结构,但它跟实际的树也有一些不同的地方...
树的概念
树的定义:树是一种 数据结构,由 n(n>=0) 个 有限结点 和 一系列结点间关系的边 组成的集合。
当 n = 0 时,称为空树。
对于结点,有一个非常 重要 的概念:
父亲结点 与 孩子结点
父亲结点和孩子结点的关系一般用带箭头的边表示,箭头所指的结点就是一个父亲结点的孩子结点。
上图中它们的关系:
每个父亲结点 至少一个 孩子结点。
每个孩子结点 只有一个 父亲结点。
父亲结点还可称作 双亲结点。
根结点与叶子结点
根据 父亲 与 孩子 的关系,还有一些关系可以被表示:
没有 父亲结点 的结点是 根结点。
没有 孩子结点 的结点是 叶子结点。
一棵非空树中最多有一个根结点,但可以拥有很多个叶子结点。
如下图表示:
程序中的根结点跟现实中的树的根 正好相反,其实可以理解为:程序中的树就是一棵现实中“颠倒”的树。
想一想:当一棵树结点个数为 1 时,有几个根结点和叶子结点呢?
树的性质
由 父亲 和 孩子 的关系还能得到一些关于树的重要信息:
树上 结点个数为 n,边的数量为
n−1。
树上 任意 两个相邻结点之间 有且仅有 一条边的关系。
相邻:对于两个结点来说,它们有直接的边相连这样的关系叫做相邻。
入度和出度
前面讲到 带箭头的边,它其实还有一种特殊的称谓:入度和出度。
-
入度:一个结点接受箭头所指边的个数。
-
出度:一个结点向外指出带箭头边的数量。
对于上图来说,
2 号结点入度为 1,接受一条由 1 号点指向
2 号点的边;
2 号结点出度为 2,有两条向外指向其他结点的边。
从边的角度看入度出度:
-
一条带箭头的边会贡献出 一个 入度和出度。
因此,一棵树上所有结点的 入度和 与 出度和 一定是 相等 的。
想一想:一个树上某个结点入度出度 最大 为多少?最小 为多少?
树的深度
树的深度:树中结点的最大层次
补充:树中每个结点可按照父亲与孩子的关系进行分层,像家谱关系一样,父亲结点在孩子结点的上一层。所以每个结点都有 对应的结点深度(所在层数),每棵树的深度就是所有结点中的 最大深度。
如上图中,每个结点对应的结点深度在图中已经标出,那么整棵树的深度应该是 4。
子树
子树:树的其中一个结点以及其下面的所有的结点所构成的树。
如上图所示,以 C 为根结点的子树是结点
A 的子树。
2.二叉树
二叉树
二叉树是一种特殊的树。
二叉树:由n(n≥0) 个结点构成的有限集合,该集合可能为空集合(称为 空二叉树),或者仅由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
由二叉树的定义和简单图示,可得到以下 特点:
每个结点 最多有两棵子树,所以二叉树中不存在度大于 2 的结点。
左子树和右子树是 有顺序的,次序不能任意颠倒。
即使树中某结点 只有一棵子树,也要 区分 它是左子树还是右子树。
二叉树的性质
-
在二叉树的第
i 层上最多有 2的i次方-1 个结点。(i≥1) -
二叉树中如果深度为
k,那么最多有 2的k次方−1 个结点。(
k≥1)