mirror of
https://github.com/krahets/hello-algo.git
synced 2025-11-03 05:27:55 +08:00
finetune
This commit is contained in:
@ -863,7 +863,4 @@ AVL 树的节点查找操作与二叉搜索树一致,在此不再赘述。
|
||||
|
||||
- 组织和存储大型数据,适用于高频查找、低频增删的场景。
|
||||
- 用于构建数据库中的索引系统。
|
||||
|
||||
!!! question "为什么红黑树比 AVL 树更受欢迎?"
|
||||
|
||||
红黑树的平衡条件相对宽松,因此在红黑树中插入与删除节点所需的旋转操作相对较少,在节点增删操作上的平均效率高于 AVL 树。
|
||||
- 红黑树在许多应用中比 AVL 树更受欢迎。这是因为红黑树的平衡条件相对宽松,在红黑树中插入与删除节点所需的旋转操作相对较少,其节点增删操作的平均效率更高。
|
||||
|
||||
@ -195,10 +195,11 @@
|
||||
|
||||
### 删除节点
|
||||
|
||||
先在二叉树中查找到目标节点,再将其从二叉树中删除。
|
||||
|
||||
与插入节点类似,我们需要保证在删除操作完成后,二叉搜索树的“左子树 < 根节点 < 右子树”的性质仍然满足。
|
||||
|
||||
1. 在二叉树中执行查找操作,获取待删除节点。
|
||||
2. 根据待删除节点的子节点数量(三种情况),执行对应的删除节点操作。
|
||||
因此,我们需要根据目标节点的子节点数量,共分为 0、1 和 2 这三种情况,执行对应的删除节点操作。
|
||||
|
||||
如下图所示,当待删除节点的度为 $0$ 时,表示该节点是叶节点,可以直接删除。
|
||||
|
||||
|
||||
@ -182,7 +182,7 @@
|
||||
|
||||

|
||||
|
||||
!!! tip "高度与深度的定义"
|
||||
!!! tip
|
||||
|
||||
请注意,我们通常将“高度”和“深度”定义为“走过边的数量”,但有些题目或教材可能会将其定义为“走过节点的数量”。在这种情况下,高度和深度都需要加 1 。
|
||||
|
||||
|
||||
@ -12,6 +12,8 @@
|
||||
|
||||

|
||||
|
||||
### 代码实现
|
||||
|
||||
广度优先遍历通常借助“队列”来实现。队列遵循“先进先出”的规则,而广度优先遍历则遵循“逐层推进”的规则,两者背后的思想是一致的。
|
||||
|
||||
=== "Java"
|
||||
@ -86,9 +88,10 @@
|
||||
[class]{}-[func]{level_order}
|
||||
```
|
||||
|
||||
**时间复杂度**:所有节点被访问一次,使用 $O(n)$ 时间,其中 $n$ 为节点数量。
|
||||
### 复杂度分析
|
||||
|
||||
**空间复杂度**:在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 $(n + 1) / 2$ 个节点,占用 $O(n)$ 空间。
|
||||
- **时间复杂度 $O(n)$** :所有节点被访问一次,使用 $O(n)$ 时间,其中 $n$ 为节点数量。
|
||||
- **空间复杂度 $O(n)$** :在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 $(n + 1) / 2$ 个节点,占用 $O(n)$ 空间。
|
||||
|
||||
## 前序、中序、后序遍历
|
||||
|
||||
@ -98,6 +101,10 @@
|
||||
|
||||

|
||||
|
||||
### 代码实现
|
||||
|
||||
深度优先搜索通常基于递归实现:
|
||||
|
||||
=== "Java"
|
||||
|
||||
```java title="binary_tree_dfs.java"
|
||||
@ -218,13 +225,9 @@
|
||||
[class]{}-[func]{post_order}
|
||||
```
|
||||
|
||||
**时间复杂度**:所有节点被访问一次,使用 $O(n)$ 时间,其中 $n$ 为节点数量。
|
||||
|
||||
**空间复杂度**:在最差情况下,即树退化为链表时,递归深度达到 $n$ ,系统占用 $O(n)$ 栈帧空间。
|
||||
|
||||
!!! note
|
||||
|
||||
我们也可以不使用递归,仅基于迭代实现前、中、后序遍历,有兴趣的同学可以自行实现。
|
||||
深度优先搜索也可以基于迭代实现,有兴趣的同学可以自行研究。
|
||||
|
||||
下图展示了前序遍历二叉树的递归过程,其可分为“递”和“归”两个逆向的部分。
|
||||
|
||||
@ -263,3 +266,8 @@
|
||||
|
||||
=== "<11>"
|
||||

|
||||
|
||||
### 复杂度分析
|
||||
|
||||
- **时间复杂度 $O(n)$** :所有节点被访问一次,使用 $O(n)$ 时间。
|
||||
- **空间复杂度 $O(n)$** :在最差情况下,即树退化为链表时,递归深度达到 $n$ ,系统占用 $O(n)$ 栈帧空间。
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
# 小结
|
||||
|
||||
### 重点回顾
|
||||
|
||||
- 二叉树是一种非线性数据结构,体现“一分为二”的分治逻辑。每个二叉树节点包含一个值以及两个指针,分别指向其左子节点和右子节点。
|
||||
- 对于二叉树中的某个节点,其左(右)子节点及其以下形成的树被称为该节点的左(右)子树。
|
||||
- 二叉树的相关术语包括根节点、叶节点、层、度、边、高度和深度等。
|
||||
@ -12,7 +14,7 @@
|
||||
- AVL 树,也称为平衡二叉搜索树,它通过旋转操作,确保在不断插入和删除节点后,树仍然保持平衡。
|
||||
- AVL 树的旋转操作包括右旋、左旋、先右旋再左旋、先左旋再右旋。在插入或删除节点后,AVL 树会从底向顶执行旋转操作,使树重新恢复平衡。
|
||||
|
||||
## Q & A
|
||||
### Q & A
|
||||
|
||||
!!! question "对于只有一个节点的二叉树,树的高度和根节点的深度都是 $0$ 吗?"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user