This commit is contained in:
krahets
2023-05-21 19:58:35 +08:00
parent 5a68f683b9
commit 2a72cceca6
6 changed files with 29 additions and 13 deletions
@@ -8,7 +8,9 @@ comments: true
回溯算法通常采用「深度优先搜索」来遍历解空间。在二叉树章节中,我们提到前序、中序和后序遍历都属于深度优先搜索。下面,我们从二叉树的前序遍历入手,逐步了解回溯算法的工作原理。
!!! question "例题一:在二叉树中搜索并返回所有值为 $7$ 的节点"
!!! question "例题一"
给定一个二叉树,搜索并记录所有值为 $7$ 的节点,返回节点列表。
**解题思路**:前序遍历这颗树,并判断当前节点的值是否为 $7$ ,若是则将该节点的值加入到结果列表 `res` 之中。
@@ -169,7 +171,9 @@ comments: true
值得说明的是,**回退并不等价于函数返回**。为解释这一点,我们对例题一稍作拓展。
!!! question "在二叉树中搜索所有值为 $7$ 的节点,**返回根节点到这些节点的路径**"
!!! question "例题二"
在二叉树中搜索所有值为 $7$ 的节点,**返回根节点到这些节点的路径**。
**解题思路**:在例题一代码的基础上,我们需要借助一个列表 `path` 记录访问过的节点路径。当访问到值为 $7$ 的节点时,则复制 `path` 并添加进结果列表 `res` 。遍历完成后,`res` 中保存的就是所有的解。
@@ -393,7 +397,9 @@ comments: true
复杂的回溯问题通常包含一个或多个约束条件,**约束条件通常可用于“剪枝”**。
!!! question "例题三:在二叉树中搜索所有值为 $7$ 的节点,返回根节点到这些节点的路径,**路径中不能包含值为 $3$ 的节点**"
!!! question "例题三"
在二叉树中搜索所有值为 $7$ 的节点,返回根节点到这些节点的路径,**路径中不能包含值为 $3$ 的节点**。
**解题思路**:在例题二的基础上添加剪枝操作,当遇到值为 $3$ 的节点时,则终止继续搜索。
+3 -1
View File
@@ -4,7 +4,9 @@ comments: true
# 12.3.   N 皇后问题
!!! question "根据国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。给定 $n$ 个皇后和一个 $n \times n$ 大小的棋盘,寻找使得所有皇后之间无法相互攻击的摆放方案。"
!!! question
根据国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。给定 $n$ 个皇后和一个 $n \times n$ 大小的棋盘,寻找使得所有皇后之间无法相互攻击的摆放方案。
如下图所示,当 $n = 4$ 时,共可以找到两个解。从回溯算法的角度看,$n \times n$ 大小的棋盘共有 $n^2$ 个格子,给出了所有的选择 `choices` 。在逐个放置皇后的过程中,棋盘状态在不断地变化,每个时刻的棋盘就是状态 `state`
+6 -2
View File
@@ -20,7 +20,9 @@ comments: true
## 12.2.1.   无重复的情况
!!! question "输入一个整数数组,数组中不包含重复元素,返回所有可能的排列。"
!!! question
输入一个整数数组,数组中不包含重复元素,返回所有可能的排列。
**从回溯算法的角度看,我们可以把生成排列的过程想象成一系列选择的结果**。假设输入数组为 $[1, 2, 3]$ ,如果我们先选择 $1$ 、再选择 $3$ 、最后选择 $2$ ,则获得排列 $[1, 3, 2]$ 。回退表示撤销一个选择,之后继续尝试其他选择。
@@ -344,7 +346,9 @@ comments: true
## 12.2.2.   考虑重复的情况
!!! question "输入一个整数数组,**数组中可能包含重复元素**,返回所有不重复的排列。"
!!! question
输入一个整数数组,**数组中可能包含重复元素**,返回所有不重复的排列。
假设输入数组为 $[1, 1, 2]$ 。为了方便区分两个重复的元素 $1$ ,接下来我们将第二个元素记为 $\hat{1}$ 。如下图所示,上述方法生成的排列有一半都是重复的。