Skip to content

Commit

Permalink
Update 01.Binary-Tree-Basic.md
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Nov 5, 2022
1 parent c932855 commit ea3ff86
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
- 包括根节点在内,每个节点可以有多个后继节点。
- 当 $n > 1$ 时,除了根节点之外的其他节点,可分为 $m(m > 0)$ 个互不相交的有限集合 $T_1, T_2, ..., T_m$,其中每一个集合本身又是一棵树,并且被称为根的 **「子树(SubTree)」**

如下图所示,红色节点 `A` 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B、E、H、I、G)$、$T_2(C)$、$T_3(D、F、G、K)$。
如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B、E、H、I、G)$、$T_2(C)$、$T_3(D、F、G、K)$。

![](https://qcdn.itcharge.cn/images/20220218104556.png)

Expand All @@ -27,15 +27,15 @@

#### 1.2.1 节点分类

**「树的节点」** 由一个数据元素和若干个指向其子树的树的分支组成。而节点所含有的子树个数称为 **「节点的度」**。度为 `0` 的节点称为 **「叶子节点」** 或者 **「终端节点」**,度不为 `0` 的节点称为 **「分支节点」** 或者 **「非终端节点」**。树中各节点的最大度数称为 **「树的度」**
**「树的节点」** 由一个数据元素和若干个指向其子树的树的分支组成。而节点所含有的子树个数称为 **「节点的度」**。度为 $0$ 的节点称为 **「叶子节点」** 或者 **「终端节点」**,度不为 $0$ 的节点称为 **「分支节点」** 或者 **「非终端节点」**。树中各节点的最大度数称为 **「树的度」**

![](https://qcdn.itcharge.cn/images/20220218134918.png)

- **树的节点**:由一个数据元素和若干个指向其子树的树的分支组成。
- **节点的度**:一个节点所含有的子树个数。
- **叶子节点(终端节点)**:度为 0 的节点。例如图中叶子节点为 `C``H``I``G``F``K`
- **分支节点(非终端节点)**:度不为 0 的节点。例如图中分支节点为 `A``B``D``E``G`
- **树的度**:树中节点的最大度数。例如图中树的度为 `3`
- **叶子节点(终端节点)**:度为 $0$ 的节点。例如图中叶子节点为 `C``H``I``G``F``K`
- **分支节点(非终端节点)**:度不为 $0$ 的节点。例如图中分支节点为 `A``B``D``E``G`
- **树的度**:树中节点的最大度数。例如图中树的度为 $3$

#### 1.2.2 节点间关系

Expand All @@ -53,11 +53,11 @@

![](https://qcdn.itcharge.cn/images/20220218144813.png)

- **节点的层次**:从根节点开始定义,根为第 1 层,根的子节点为第 2 层,以此类推。
- **树的深度(高度)**:所有节点中最大的层数。例如图中树的深度为 `4`
- **节点的层次**:从根节点开始定义,根为第 $1$ 层,根的子节点为第 $2$ 层,以此类推。
- **树的深度(高度)**:所有节点中最大的层数。例如图中树的深度为 $4$
- **堂兄弟节点**:父节点在同一层的节点互为堂兄弟。例如图中 `G``K` 互为堂兄弟节点。
- **路径**:树中两个节点之间所经过的节点序列。例如图中 `E``G` 的路径为 `E - B - A - D - G`
- **路径长度**:两个节点之间路径上经过的边数。例如图中 `E``G` 的路径长度为 `4`
- **路径长度**:两个节点之间路径上经过的边数。例如图中 `E``G` 的路径长度为 $4$
- **节点的祖先**:从该节点到根节点所经过的所有节点,被称为该节点的祖先。例如图中 `H` 的祖先为 `E``B``A`
- **节点的子孙**:节点的子树中所有节点被称为该节点的子孙。例如图中 `D` 的子孙为 `F``G``K`

Expand Down Expand Up @@ -85,9 +85,9 @@
- **空树**:二叉树是一棵空树。
- **非空树**:二叉树是由一个根节点和两棵互不相交的子树 $T_1$、$T_2$,分别称为根节点的左子树、右子树组成的非空树;并且 $T_1$、$T_2$ 本身都是二叉树。

⼆叉树是种特殊的树,它最多有两个⼦树,分别为左⼦树和右⼦树,并且两个子树是有序的,不可以互换。也就是说,在⼆叉树中不存在度⼤于 `2` 的节点。
⼆叉树是种特殊的树,它最多有两个⼦树,分别为左⼦树和右⼦树,并且两个子树是有序的,不可以互换。也就是说,在⼆叉树中不存在度⼤于 $2$ 的节点。

二叉树在逻辑上可以分为 `5` 种基本形态,如下图所示。
二叉树在逻辑上可以分为 $5$ 种基本形态,如下图所示。

![](https://qcdn.itcharge.cn/images/20220218164839.png)

Expand All @@ -102,10 +102,10 @@
满二叉树满足以下特点:

- 叶子节点只出现在最下面一层。
- 非叶子节点的度一定为 `2`
- 非叶子节点的度一定为 $2$
- 在同等深度的二叉树中,满二叉树的节点个数最多,叶子节点个数最多。

如果我们对满二叉树的节点进行编号,根结点编号为 `1`,然后按照层次依次向下,每一层从左至右的顺序进行编号。则深度为 $k$ 的满二叉树最后一个节点的编号为 $2^k - 1$。
如果我们对满二叉树的节点进行编号,根结点编号为 $1$,然后按照层次依次向下,每一层从左至右的顺序进行编号。则深度为 $k$ 的满二叉树最后一个节点的编号为 $2^k - 1$。

我们可以来看几个例子。

Expand All @@ -123,7 +123,7 @@
- 如果节点的度为 `1`,则该节点只偶遇左孩子节点,即不存在只有右子树的情况。
- 同等节点数的二叉树中,完全二叉树的深度最小。

完全二叉树也可以使用类似满二叉树的节点编号的方式来定义。即从根节点编号为 `1` 开始,按照层次从上至下,每一层从左至右进行编号。对于深度为 `i` 且有 `n` 个节点的二叉树,当且仅当每一个节点都与深度为 `k` 的满二叉树中编号从 `1``n` 的节点意义对应时,该二叉树为完全二叉树。
完全二叉树也可以使用类似满二叉树的节点编号的方式来定义。即从根节点编号为 $1$ 开始,按照层次从上至下,每一层从左至右进行编号。对于深度为 $i$ 且有 $n$ 个节点的二叉树,当且仅当每一个节点都与深度为 $k$ 的满二叉树中编号从 $1$$n$ 的节点意义对应时,该二叉树为完全二叉树。

我们可以来看几个例子。

Expand All @@ -137,21 +137,21 @@
> - 如果任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
> - 任意节点的左子树、右子树均为二叉搜索树。
如图所示,这 `3` 棵树都是二叉搜索树。
如图所示,这 $3$ 棵树都是二叉搜索树。

![](https://qcdn.itcharge.cn/images/20220218175944.png)

#### 2.2.4 平衡二叉搜索树

> **平衡二叉搜索树(Balanced Binary Tree)**:一种结构平衡的二叉搜索树。即叶节点高度差的绝对值不超过 `1`,并且左右两个子树都是一棵平衡二叉搜索树。平衡二叉树可以在 $O(logn)$ 内完成插入、查找和删除操作。最早被发明的平衡二叉搜索树为 **「AVL 树(Adelson-Velsky and Landis Tree))」**
> **平衡二叉搜索树(Balanced Binary Tree)**:一种结构平衡的二叉搜索树。即叶节点高度差的绝对值不超过 $1$,并且左右两个子树都是一棵平衡二叉搜索树。平衡二叉树可以在 $O(logn)$ 内完成插入、查找和删除操作。最早被发明的平衡二叉搜索树为 **「AVL 树(Adelson-Velsky and Landis Tree))」**
>
> AVL 树满足以下性质:
>
> - 空二叉树是一棵 AVL 树。
> - 如果 T 是一棵 AVL 树,那么其左右子树也是 AVL 树,并且 $|h(ls) - h(rs)| \le 1$,$h(ls)$ 是左子树的高度,$h(rs)$ 是右子树的高度。
> - AVL 树的高度为 $O(log n)$。
如图所示,前 `2` 棵树是平衡二叉搜索树,最后一棵树不是平衡二叉搜索树,因为这棵树的左右子树的高度差的绝对值超过了 `1`
如图所示,前 $2$ 棵树是平衡二叉搜索树,最后一棵树不是平衡二叉搜索树,因为这棵树的左右子树的高度差的绝对值超过了 $1$

![](https://qcdn.itcharge.cn/images/20220221103552.png)

Expand All @@ -171,8 +171,8 @@

从图中我们也可以看出节点之间的逻辑关系。

- 如果某二叉树节点(非叶子节点)的下标为 `i`,那么其左孩子节点下标为 `2 * i + 1`,右孩子节点下标为 `2 * i + 2`
- 如果某二叉树节点(非根结点)的下标为 `i`,那么其根节点下标为 `(i - 1) // 2``//` 表示整除。
- 如果某二叉树节点(非叶子节点)的下标为 $i$,那么其左孩子节点下标为 $2 * i + 1$,右孩子节点下标为 $2 * i + 2$
- 如果某二叉树节点(非根结点)的下标为 $i$,那么其根节点下标为 $(i - 1) // 2$。$//$ 表示整除。

对于完全二叉树(尤其是满二叉树)来说,采用顺序存储结构比较合适,它能充分利用存储空间;而对于一般二叉树,如果需要设置很多的「空节点」,则采用顺序存储结构就会浪费很多存储空间。并且,由于顺序存储结构固有的一些缺陷,会使得二叉树的插入、删除等操作不方便,效率也比较低。对于二叉树来说,当树的形态和大小经常发生动态变化时,更适合采用链式存储结构。

Expand Down

0 comments on commit ea3ff86

Please sign in to comment.