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

@@ -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)$ 栈帧空间。