This commit is contained in:
krahets
2023-08-29 20:57:37 +08:00
parent cf0d4b32ec
commit d387d9d41d
29 changed files with 85 additions and 58 deletions

View File

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

View File

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

View File

@ -182,7 +182,7 @@
![二叉树的常用术语](binary_tree.assets/binary_tree_terminology.png)
!!! tip "高度与深度的定义"
!!! tip
请注意,我们通常将“高度”和“深度”定义为“走过边的数量”,但有些题目或教材可能会将其定义为“走过节点的数量”。在这种情况下,高度和深度都需要加 1 。

View File

@ -12,6 +12,8 @@
![二叉树的层序遍历](binary_tree_traversal.assets/binary_tree_bfs.png)
### 代码实现
广度优先遍历通常借助“队列”来实现。队列遵循“先进先出”的规则,而广度优先遍历则遵循“逐层推进”的规则,两者背后的思想是一致的。
=== "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 @@
![二叉搜索树的前、中、后序遍历](binary_tree_traversal.assets/binary_tree_dfs.png)
### 代码实现
深度优先搜索通常基于递归实现:
=== "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>"
![preorder_step11](binary_tree_traversal.assets/preorder_step11.png)
### 复杂度分析
- **时间复杂度 $O(n)$** :所有节点被访问一次,使用 $O(n)$ 时间。
- **空间复杂度 $O(n)$** :在最差情况下,即树退化为链表时,递归深度达到 $n$ ,系统占用 $O(n)$ 栈帧空间。

View File

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