1. BFS与DFS
1.1 BFS
DFS即Depth First Search
,深度优先搜索。它是一种图遍历算法,它从一个起始点开始,逐层扩展搜索范围
,直到找到目标节点为止。
这种算法通常用于解决“最短路径”问题
,比如在迷宫中
找到从起点到终点的最短路径
- 首先,从起点开始,检查所有与它相邻的位置,也就是距离起点为1的位置
- 然后,继续向外扩展,检查所有距离起点为2的位置,以此类推,直到找到出口
我们发现每次搜索的位置都是距离当前节点最近的点。因此,BFS是具有最短路的性质的。在BFS中,可以使用队列来存储待搜索的节点。起始点
首先加入队列中,然后不断从队列中取出节点
,检查它是否是目标节点。如果不是,就将它的所有未被访问过的邻居加入队列中
。这样,队列中的节点总是按照它们距离起点的距离排序,先加入队列的节点总是先被取出来搜索
。
通过这种方式,BFS可以找到起点到目标节点的最短路径。在实际应用中,BFS还可以用于拓扑排序、连通性检测等问题的解决。
1.2 DFS
DFS
即Depth First Search
,深度优先搜索。它从一个起始点开始,一直往下走直到不能再走为止
(简单理解:一条路走到黑),然后返回到前一个节点
,继续探索它的其他分支
,直到找到目标节点
为止。这种算法通常用于解决“遍历”问题
,比如在树中查找所有的叶子节点
。
要理解DFS,也还可以想象自己在迷宫中寻找所有可行的路径
- 首先,你会从起点开始,顺着一条路一直走,直到你走到一个死胡同
- 再返回到前一个节点,继续探索其他分支
在DFS中,你可以使用递归或栈来实现深度优先搜索。通过这种方式,DFS可以找到所有可行的路径
,或者在树中查找所有的叶子节点。
在实际应用中,DFS还可以用于拓扑排序、连通性检测等问题的解决。与BFS相比,DFS通常更适合处理深度优先的问题
,而BFS更适合处理广度优先的问题
。
1.3 BFS与DFS的比较
如果分别用DFS 与 BFS 将二叉树的所有结点遍历一遍,那么它们遍历结点的顺序分别如下
所示
接下来,让我们先看看在二叉树上进行 BFS 遍历和 DFS 遍历的代码比较
(1)DFS 使用递归遍历
:
void dfs(TreeNode* root)
{if (root == nullptr) {return;}// 依次递归遍历它的左子树和右子树dfs(root->left);dfs(root->right);
}
(2)BFS 遍历使用队列相关的数据结构
:
void bfs(TreeNode* root)
{// 创建一个队列queue<TreeNode*> q;q.push(root);while (!q.empty()) {// 在每次循环中,使用 q.front() 获取队头节点,并将其出队TreeNode* node = q.front();q.pop();// 然后将下一层的节点加入队列中// 检查这个节点的左右子节点是否为空,如果不为空,就将它们加入队列中if (node->left != nullptr) {q.push(node->left);}if (node->right != nullptr){q.push(node->right);}}
}
参考博客: https://blog.csdn.net/v_JULY_v/article/details/6111353