文章目录
1. 树
树在数据结构中属于一种非线性结构,每个元素可以有多个前驱和后继,它有如下定义:
树是 n (n≥0) 个元素的集合:
- n = 0 时,成为空树
- 树只有一个特殊的没有前驱的元素,称为数的根 Root
- 树中除了根结点外,其余元素只能有一个前驱,可以有零个或者多个后继
递归定义:
- 树 T 是 n (n≥0) 个元素的集合。n = 0 时,成为空树
- 有且只有一个特殊元素根,剩余元素都可以被划分为 m 个互不相交的集合 T1,T2,…,Tm,而每一个集合都是树,成为 T 的子树 Subtree
- 子树也有自己的根
2. 树的概念
树是一个非常抽象的概念,下面主要介绍树中各种名词的含义:
名称 | 含义 |
---|---|
结点 | 树中的数据元素 |
树的度 | 树内各结点的度的最大值 |
结点的度 (degree) | 结点拥有的子树的数目成为度,记作 d (v) |
叶子结点 | 结点的度数为 0,称为叶子结点 leaf、终端结点、末端结点 |
分支结点 | 结点度数不为 0,称为非终端结点或分支结点 |
分支 | 结点之间的关系 |
内部结点 | 除根结点外的分支结点,当然也不包括叶子结点 |
孩子 (儿子 Child) 结点 | 结点的子树的根结点成为该结点的孩子 |
双亲 (父 Parent) 结点 | 一个结点是它各个树的根结点的双亲 |
兄弟 (Sibling) 结点 | 具有相同双亲结点的结点 |
祖先结点 | 从根结点到该结点所经分支上所有的结点。 |
子孙结点 | 结点的所有子树上的结点都成为该结点的子孙。 |
结点的层次 (Level) | 根结点为第一层,根的孩子为第二层,依次类推记作 (Lv) |
树的深度 (高度 Depth) | 树的层次的最大值 |
堂兄弟 | 双亲在同一层的结点 |
有序树 | 结点的子树是有顺序的 (兄弟有大小,有先后次序),不能交换 |
无序树 | 结点的子树是无序的,可以交换 |
路径 | 树中的 k 个结点 n1、n2、…nk,满足 ni 是 n (i+1) 的双亲,成为 n1 到 nk 的一条路径。就是一条线串下来的,前一个都是后一个父 (前驱) 结点。 |
森林 | m (m≥0) 棵不相交的树的集合,对于结点而言,其子树的集合就是森林。 |
3. 树的特点
下面我们来总结一下树的特点:
- 唯一的根
- 子树不相交
- 除了根以外,每个元素只能有一个前驱,可以有零个或多个后继
- 根结点没有双亲结点 (前驱),叶子结点没有孩子结点 (后继)
- vi 是 vj 的双亲,则 L(vi) = L(vj) - 1 ,也就是说双亲比孩子结点的层次小 1
堂兄弟的双亲是兄弟关系吗?
- 堂兄弟定义是:双亲结点在同一层的结点
- 上图 J 和 K 是堂兄弟,因为它们的双亲结点 D 和 F 在第三层,依然是堂兄弟
- 因此,堂兄弟的双亲不一定是兄弟关系
4. 二叉树
二叉树是一种特别的树,它有如下特点:
- 每个结点最多 2 棵子树,即二叉树不存在度数大于 2 的结点
- 它是有序树,左子树、右子树是顺序的,不能交换次序
- 即使某一个结点只有一棵子树,也要确定它是左子树还是右子树
二叉树的五种基本形态:
- 空二叉树
- 只有一个根结点
- 根结点只有左子树
- 根结点只有右子树
- 根结点有左子树和右子树
4.1. 斜树
分为左斜树和右斜树:
- 左斜树:所有结点都只有左子树
- 右斜树:所有结点都只有右子树
4.2. 满二叉树
满二叉树有如下特点:
- 一棵二叉树的所有分支结构都存在左子树和右子树,并且所有叶子结点只存在在最下面一层。
- 同样深度二叉树中,满二叉树的结点最多
- K 为深度 (1≤k≤n), 则结点总数为 2^k - 1
- 下面是一个深度为 4 的 15 个结点的满二叉树
4.3. 完全二叉树
完全二叉树的特点:
- 若二叉树的深度为 k,二叉树的层数从 1 到 k-1 层的结点数都达到了最大个数,在第 k 层的所有结点都集中在最左边,这就是完全二叉树
- 完全二叉数由满二叉树引出
- 满二叉树一定是完全二叉树,但完全二叉树不是满二叉树
- k 为深度 (1≤k≤n), 则结点总数的最大值为 2^k - 1, 当达到最大值的时候就是满二叉树
- 下面是一个深度为 4 的完全二叉树
注意:完全二叉树 K 层结点都靠左排列,否则不能称为完全二叉树
4.4. 二叉树的性质
下面列举一些二叉树的特性,
4.4.1. 性质 1
在二叉树的第 i 层上至多有 2^(i-1) 个结点 (i≥1)
以上图为例当 i 等于 4 时,那么第 4 层最多含有 2^(4-1),也就是 8 个元素
4.4.2. 性质 2
深度为 k 的二叉树,至多有 2^k - 1 个结点 (k≥1)
4.4.3. 性质 3
对任何一棵二叉树 T,如果其终端结点为 n0, 度数为 2 的结点为 n2,则有 n0 = n2 + 1。换一句话说,就是 叶子结点数 - 1 = 度数为 2 的结点数
证明:
- 总结点数为 n=n0+n1+n2,n1 是度数为 1 的结点总数。
- 一棵树的分支结点为 n-1,因为除了根结点外,其余结点都有一个分支,即 n0+n1+n2-1
- 分支数还等于 n00+n11+n22,n2 是 2 分支结点所以乘以 2,2m2+n1
- 可得 2*n2+n1=N0+n1+n2-1 ==> n2=n0-1
4.4.4. 性质 4
具有 n 个结点的完全二叉树的深度为 int (log2n) + 1 或者 math.ceil (log2 (n+1))
4.4.5. 性质 5
如果有一棵 n 个结点的完全二叉树 (深度为性质 4)
- 如果 i=1, 则结点 i 是二叉树的根,无双亲;如果 i>1,则其双亲是 int (i/2), 向下取整。就是子结点的编号整出 2 得到的就是父结点的编号。父结点如果是 i,那么左孩子为 2i,右孩子结点就是 2i+1。
- 如果 2i>n,则结点 i 无左孩子,即结点 i 为叶子结点;否则其左孩子结点存在编号为 2i。
- 如果 2i+1>n,则结点 i 无右孩子,注意这里并不能说明结点 i 没有左孩子;否则右孩子结点存在编号为 2i+1.
4.4.6. 其他性质
- 高度为 k 的二叉树,至少有 k 个结点。
- 含有 n (n≥1) 的结点的二叉树高度至多为 n。
- 含有 n (n≥1) 的结点的二叉树的高度至多为 n,最小为 math (log2 (n+1)),不小于对整数值的最小整数,向上取整。
- 假设高度为 h, 2^h-1=n ==> h=log2 (n+1), 层数是取整。如果是 8 个结点,3.1699 就要向上取整为 4,即 4 层