BFS与DFS学习笔记
BFS与DFS
概念
维基:
广度优先搜索算法(英语:Breadth-First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
选择
-
BFS比较适合判断二分图,以及用于实现寻找最小生成树(MST),如在BFS基础上的Kruskal算法。还有寻找最短路径问题(如Dijkstra算法)。
-
DFS比较适合判断图中是否有环,寻找两个节点之间的路径,有向无环图(DAG)的拓扑排序,寻找所有强连通片(SCC),无向图中寻找割点和桥等。
-
bfs是浪费空间节省时间,dfs是浪费时间节省空间。
解决二叉树问题的模板
BFS模板
Queue<TreeNode> queue = new Queue<TreeNode>();
if (root != null)
{
queue.Enqueue(root);
}
while (queue.Count != 0)
{
int queueCount = queue.Count;
for (int i = 0; i < queueCount; i++)
{
//出队并获取结点
TreeNode node = queue.Dequeue();
//出队结点的叶子结点入队
if (node.left != null)
{
queue.Enqueue(node.left);
}
if (node.right != null)
{
queue.Enqueue(node.right);
}
}
}
DFS模板
//递归
void DFS(TreeNode node)
{
if (node.left != null)
{
DFS(node.left);
}
if (node.right != null)
{
DFS(node.right);
}
}