This commit is contained in:
krahets
2024-04-03 04:41:27 +08:00
parent 20f79f5f32
commit 8591529021
47 changed files with 136 additions and 135 deletions

View File

@ -18,11 +18,11 @@ comments: true
<p align="center"> 图 7-25 &nbsp; AVL 树在插入节点后发生退化 </p>
1962 年 G. M. Adelson-Velsky 和 E. M. Landis 在论文“An algorithm for the organization of information”中提出了「AVL 树」。论文中详细描述了一系列操作确保在持续添加和删除节点后AVL 树不会退化,从而使得各种操作的时间复杂度保持在 $O(\log n)$ 级别。换句话说在需要频繁进行增删查改操作的场景中AVL 树能始终保持高效的数据操作性能,具有很好的应用价值。
1962 年 G. M. Adelson-Velsky 和 E. M. Landis 在论文“An algorithm for the organization of information”中提出了<u>AVL</u>。论文中详细描述了一系列操作确保在持续添加和删除节点后AVL 树不会退化,从而使得各种操作的时间复杂度保持在 $O(\log n)$ 级别。换句话说在需要频繁进行增删查改操作的场景中AVL 树能始终保持高效的数据操作性能,具有很好的应用价值。
## 7.5.1 &nbsp; AVL 树常见术语
AVL 树既是二叉搜索树,也是平衡二叉树,同时满足这两类二叉树的所有性质,因此是一种平衡二叉搜索树 balanced binary search tree
AVL 树既是二叉搜索树,也是平衡二叉树,同时满足这两类二叉树的所有性质,因此是一种<u>平衡二叉搜索树balanced binary search tree</u>
### 1. &nbsp; 节点高度
@ -479,7 +479,7 @@ AVL 树既是二叉搜索树,也是平衡二叉树,同时满足这两类二
### 2. &nbsp; 节点平衡因子
节点的平衡因子 balance factor定义为节点左子树的高度减去右子树的高度,同时规定空节点的平衡因子为 $0$ 。我们同样将获取节点平衡因子的功能封装成函数,方便后续使用:
节点的<u>平衡因子balance factor</u>定义为节点左子树的高度减去右子树的高度,同时规定空节点的平衡因子为 $0$ 。我们同样将获取节点平衡因子的功能封装成函数,方便后续使用:
=== "Python"

View File

@ -4,7 +4,7 @@ comments: true
# 7.4 &nbsp; 二叉搜索树
如图 7-16 所示,二叉搜索树 binary search tree满足以下条件。
如图 7-16 所示,<u>二叉搜索树binary search tree</u>满足以下条件。
1. 对于根节点,左子树中所有节点的值 $<$ 根节点的值 $<$ 右子树中所有节点的值。
2. 任意节点的左、右子树也是二叉搜索树,即同样满足条件 `1.`

View File

@ -4,7 +4,7 @@ comments: true
# 7.1 &nbsp; 二叉树
二叉树 binary tree是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。
<u>二叉树binary tree</u>是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。
=== "Python"
@ -202,7 +202,7 @@ comments: true
```
每个节点都有两个引用(指针),分别指向左子节点 left-child node」和「右子节点 right-child node,该节点被称为这两个子节点的父节点 parent node。当给定一个二叉树的节点时,我们将该节点的左子节点及其以下节点形成的树称为该节点的左子树 left subtree,同理可得右子树 right subtree
每个节点都有两个引用(指针),分别指向<u>左子节点left-child node</u>和<u>右子节点right-child node</u>,该节点被称为这两个子节点的<u>父节点parent node</u>。当给定一个二叉树的节点时,我们将该节点的左子节点及其以下节点形成的树称为该节点的<u>左子树left subtree</u>,同理可得<u>右子树right subtree</u>
**在二叉树中,除叶节点外,其他所有节点都包含子节点和非空子树**。如图 7-1 所示,如果将“节点 2”视为父节点则其左子节点和右子节点分别是“节点 4”和“节点 5”左子树是“节点 4 及其以下节点形成的树”,右子树是“节点 5 及其以下节点形成的树”。
@ -214,14 +214,14 @@ comments: true
二叉树的常用术语如图 7-2 所示。
- 根节点 root node:位于二叉树顶层的节点,没有父节点。
- 叶节点 leaf node:没有子节点的节点,其两个指针均指向 `None` 。
- 「边 edge」:连接两个节点的线段,即节点引用(指针)。
- 节点所在的「层 level」:从顶至底递增,根节点所在层为 1 。
- 节点的「度 degree:节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
- 二叉树的高度 height:从根节点到最远叶节点所经过的边的数量。
- 节点的深度 depth:从根节点到该节点所经过的边的数量。
- 节点的高度 height:从距离该节点最远的叶节点到该节点所经过的边的数量。
- <u>根节点root node</u>:位于二叉树顶层的节点,没有父节点。
- <u>叶节点leaf node</u>:没有子节点的节点,其两个指针均指向 `None` 。
- <u>边edge</u>:连接两个节点的线段,即节点引用(指针)。
- 节点所在的<u>层level</u>:从顶至底递增,根节点所在层为 1 。
- 节点的<u>度(degree</u>:节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
- 二叉树的<u>高度height</u>:从根节点到最远叶节点所经过的边的数量。
- 节点的<u>深度depth</u>:从根节点到该节点所经过的边的数量。
- 节点的<u>高度height</u>:从距离该节点最远的叶节点到该节点所经过的边的数量。
![二叉树的常用术语](binary_tree.assets/binary_tree_terminology.png){ class="animation-figure" }
@ -627,11 +627,11 @@ comments: true
### 1. &nbsp; 完美二叉树
如图 7-4 所示,完美二叉树 perfect binary tree所有层的节点都被完全填满。在完美二叉树中,叶节点的度为 $0$ ,其余所有节点的度都为 $2$ ;若树的高度为 $h$ ,则节点总数为 $2^{h+1} - 1$ ,呈现标准的指数级关系,反映了自然界中常见的细胞分裂现象。
如图 7-4 所示,<u>完美二叉树perfect binary tree</u>所有层的节点都被完全填满。在完美二叉树中,叶节点的度为 $0$ ,其余所有节点的度都为 $2$ ;若树的高度为 $h$ ,则节点总数为 $2^{h+1} - 1$ ,呈现标准的指数级关系,反映了自然界中常见的细胞分裂现象。
!!! tip
请注意,在中文社区中,完美二叉树常被称为「满二叉树」
请注意,在中文社区中,完美二叉树常被称为<u>满二叉树</u>
![完美二叉树](binary_tree.assets/perfect_binary_tree.png){ class="animation-figure" }
@ -639,7 +639,7 @@ comments: true
### 2. &nbsp; 完全二叉树
如图 7-5 所示,完全二叉树 complete binary tree只有最底层的节点未被填满,且最底层节点尽量靠左填充。
如图 7-5 所示,<u>完全二叉树complete binary tree</u>只有最底层的节点未被填满,且最底层节点尽量靠左填充。
![完全二叉树](binary_tree.assets/complete_binary_tree.png){ class="animation-figure" }
@ -647,7 +647,7 @@ comments: true
### 3. &nbsp; 完满二叉树
如图 7-6 所示,完满二叉树 full binary tree除了叶节点之外,其余所有节点都有两个子节点。
如图 7-6 所示,<u>完满二叉树full binary tree</u>除了叶节点之外,其余所有节点都有两个子节点。
![完满二叉树](binary_tree.assets/full_binary_tree.png){ class="animation-figure" }
@ -655,7 +655,7 @@ comments: true
### 4. &nbsp; 平衡二叉树
如图 7-7 所示,平衡二叉树 balanced binary tree中任意节点的左子树和右子树的高度之差的绝对值不超过 1 。
如图 7-7 所示,<u>平衡二叉树balanced binary tree</u>中任意节点的左子树和右子树的高度之差的绝对值不超过 1 。
![平衡二叉树](binary_tree.assets/balanced_binary_tree.png){ class="animation-figure" }

View File

@ -10,9 +10,9 @@ comments: true
## 7.2.1 &nbsp; 层序遍历
如图 7-9 所示,层序遍历 level-order traversal从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。
如图 7-9 所示,<u>层序遍历level-order traversal</u>从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。
层序遍历本质上属于广度优先遍历 breadth-first traversal」,也称「广度优先搜索 breadth-first search, BFS,它体现了一种“一圈一圈向外扩展”的逐层遍历方式。
层序遍历本质上属于<u>广度优先遍历breadth-first traversal</u>,也称<u>广度优先搜索breadth-first search, BFS</u>,它体现了一种“一圈一圈向外扩展”的逐层遍历方式。
![二叉树的层序遍历](binary_tree_traversal.assets/binary_tree_bfs.png){ class="animation-figure" }
@ -364,7 +364,7 @@ comments: true
## 7.2.2 &nbsp; 前序、中序、后序遍历
相应地,前序、中序和后序遍历都属于深度优先遍历 depth-first traversal」,也称「深度优先搜索 depth-first search, DFS,它体现了一种“先走到尽头,再回溯继续”的遍历方式。
相应地,前序、中序和后序遍历都属于<u>深度优先遍历depth-first traversal</u>,也称<u>深度优先搜索depth-first search, DFS</u>,它体现了一种“先走到尽头,再回溯继续”的遍历方式。
图 7-10 展示了对二叉树进行深度优先遍历的工作原理。**深度优先遍历就像是绕着整棵二叉树的外围“走”一圈**,在每个节点都会遇到三个位置,分别对应前序遍历、中序遍历和后序遍历。