This commit is contained in:
krahets
2023-08-29 20:57:15 +08:00
parent 638312fdb1
commit 9f30ce7260
29 changed files with 95 additions and 58 deletions

View File

@@ -2441,7 +2441,4 @@ AVL 树的节点查找操作与二叉搜索树一致,在此不再赘述。
- 组织和存储大型数据,适用于高频查找、低频增删的场景。
- 用于构建数据库中的索引系统。
!!! question "为什么红黑树比 AVL 树更受欢迎?"
红黑树的平衡条件相对宽松,因此在红黑树中插入与删除节点所需的旋转操作相对较少,在节点增删操作上的平均效率高于 AVL 树。
- 红黑树在许多应用中比 AVL 树更受欢迎。这是因为红黑树的平衡条件相对宽松,在红黑树中插入与删除节点所需的旋转操作相对较少,其节点增删操作的平均效率更高。

View File

@@ -731,10 +731,11 @@ comments: true
### 3.   删除节点
先在二叉树中查找到目标节点,再将其从二叉树中删除。
与插入节点类似,我们需要保证在删除操作完成后,二叉搜索树的“左子树 < 根节点 < 右子树”的性质仍然满足。
1. 在二叉树中执行查找操作,获取待删除节点。
2. 根据待删除节点的子节点数量(三种情况),执行对应的删除节点操作。
因此,我们需要根据目标节点的子节点数量,共分为 0、1 和 2 这三种情况,执行对应的删除节点操作
如图 7-19 所示,当待删除节点的度为 $0$ 时,表示该节点是叶节点,可以直接删除。

View File

@@ -190,7 +190,7 @@ comments: true
<p align="center"> 图 7-2 &nbsp; 二叉树的常用术语 </p>
!!! tip "高度与深度的定义"
!!! tip
请注意,我们通常将“高度”和“深度”定义为“走过边的数量”,但有些题目或教材可能会将其定义为“走过节点的数量”。在这种情况下,高度和深度都需要加 1 。

View File

@@ -18,6 +18,8 @@ comments: true
<p align="center"> 图 7-9 &nbsp; 二叉树的层序遍历 </p>
### 1. &nbsp; 代码实现
广度优先遍历通常借助“队列”来实现。队列遵循“先进先出”的规则,而广度优先遍历则遵循“逐层推进”的规则,两者背后的思想是一致的。
=== "Java"
@@ -322,9 +324,10 @@ comments: true
}
```
**时间复杂度**:所有节点被访问一次,使用 $O(n)$ 时间,其中 $n$ 为节点数量。
### 2. &nbsp; 复杂度分析
**间复杂度**:在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 $(n + 1) / 2$ 个节点,占用 $O(n)$ 空间
- **间复杂度 $O(n)$** :所有节点被访问一次,使用 $O(n)$ 时间,其中 $n$ 为节点数量
- **空间复杂度 $O(n)$** :在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 $(n + 1) / 2$ 个节点,占用 $O(n)$ 空间。
## 7.2.2 &nbsp; 前序、中序、后序遍历
@@ -336,6 +339,10 @@ comments: true
<p align="center"> 图 7-10 &nbsp; 二叉搜索树的前、中、后序遍历 </p>
### 1. &nbsp; 代码实现
深度优先搜索通常基于递归实现:
=== "Java"
```java title="binary_tree_dfs.java"
@@ -747,13 +754,9 @@ comments: true
}
```
**时间复杂度**:所有节点被访问一次,使用 $O(n)$ 时间,其中 $n$ 为节点数量。
**空间复杂度**:在最差情况下,即树退化为链表时,递归深度达到 $n$ ,系统占用 $O(n)$ 栈帧空间。
!!! note
我们也可以不使用递归,仅基于迭代实现前、中、后序遍历,有兴趣的同学可以自行实现
深度优先搜索也可以基于迭代实现,有兴趣的同学可以自行研究
图 7-11 展示了前序遍历二叉树的递归过程,其可分为“递”和“归”两个逆向的部分。
@@ -794,3 +797,8 @@ comments: true
![preorder_step11](binary_tree_traversal.assets/preorder_step11.png)
<p align="center"> 图 7-11 &nbsp; 前序遍历的递归过程 </p>
### 2. &nbsp; 复杂度分析
- **时间复杂度 $O(n)$** :所有节点被访问一次,使用 $O(n)$ 时间。
- **空间复杂度 $O(n)$** :在最差情况下,即树退化为链表时,递归深度达到 $n$ ,系统占用 $O(n)$ 栈帧空间。

View File

@@ -4,6 +4,8 @@ comments: true
# 7.6 &nbsp; 小结
### 1. &nbsp; 重点回顾
- 二叉树是一种非线性数据结构,体现“一分为二”的分治逻辑。每个二叉树节点包含一个值以及两个指针,分别指向其左子节点和右子节点。
- 对于二叉树中的某个节点,其左(右)子节点及其以下形成的树被称为该节点的左(右)子树。
- 二叉树的相关术语包括根节点、叶节点、层、度、边、高度和深度等。
@@ -16,7 +18,7 @@ comments: true
- AVL 树,也称为平衡二叉搜索树,它通过旋转操作,确保在不断插入和删除节点后,树仍然保持平衡。
- AVL 树的旋转操作包括右旋、左旋、先右旋再左旋、先左旋再右旋。在插入或删除节点后AVL 树会从底向顶执行旋转操作,使树重新恢复平衡。
## 7.6.1 &nbsp; Q & A
### 2. &nbsp; Q & A
!!! question "对于只有一个节点的二叉树,树的高度和根节点的深度都是 $0$ 吗?"