zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    NHibernate初学二之简单执行SQL及HQL、Linq
    NHibernate初学一之简单增删改查
    System.Func<>与System.Action<>
    C# Lambda表达式
    Lambda表达式详解
    发布订阅者模式之C#委托实现
    在WCF中实现双工通信
    设计模式---订阅发布模式(Subscribe/Publish)
    flex基础示例
    活动倒计时-兼容ios
  • 原文地址:https://www.cnblogs.com/muphalem/p/13656662.html
Copyright © 2011-2022 走看看