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);
    }
}
posted @ 2020-09-12 13:06  Muphalem  阅读(351)  评论(0编辑  收藏  举报
/* 看板娘 */