DFSDBS算法

    科技2026-02-14  19

    DFS(深度优先搜索 适合搜索全部解  在空间上有优势  因为不用保存搜索过程中的状态)

    BFS(广度优先搜索  适合最优解  在空间上需要用一个队列来保存搜索过程)

    一般情况下  DFS都是用递归来写算法  BFS需要手动维护一个队列queue

    DFS代码-递归写法 模板(记住)

    visited=set()

    def dfs(node,visited):

    visited.add(node)

    #process current node here

    for next_node in node.children():

    if not next_node in visited:

    dfs(next node,visited)

    BFS代码模板

    def BFS(Graph,start,end):

    queue=[]

    queue.append([start])

    visited.add(start)

    while queue:

    node=queue.pop()

    visited.add(node)

    process(node)

    nodes=generate_related_nodes(node)

    queue.push(nodes)

    #other processing work

    二叉树的层次遍历(解法:BFS)

    calss Sulotion{

    public List<List> levelOrder(TreeNode root){

    List<List> res=new ArrayList<List>();

    if(root==nul)  return res;

    Queue q=new LinkedList<>();  手动维护一个队列

    q.add(root);  将初始节点加入队列

    while(!q.isEmpty()){

    int level_size=q.size();  将泛型列队q的元素个数给这个level_size

    List list=new List();

    while(level_size>0){

    TreeNode node=q.poll(); 将q初始化

    list.add(node.val); list集合中加入q初始化的node的根节点

    if(node.left!=null)  q.add(node.left);  左节点

    if(node.right!=null)   q.add(node.right);  右节点

    level_size–;

    }

    res.add(list);

    }

    return res;

    }

    }

    岛屿数量(DFS)

    class  Solution{

    int dx []=new {-1,1,0,0}; 定义sink方法里的k循环内的dx和dy

    int dy []=new {0,0,1,-1};

    char [] [] g;

    public int numIslands(char [] [] gird){

    g=gird;  设置全局变量

    int islands=0;

    for(int i=0;i<g.length;i++){  遍历每一个点  是0还是1

    for(int j=0;j<g[i].length;j++){

    if(g[i][j]==‘0’])  continue; 0就是水  就过

    islands+=sink(i,j); 否则就调用sink

    }

    return islands

    }

    }

    private int sink(int i,int j){

    if(g[i][j]==‘0’)  return 0;  是0就返回水

    g[i][j]=‘0’;  否则就让1变成0

    for(k=0;i<dx.length;++k){   1附近的1一个个遍历  都变成0

    int x=i+dx[k];  int y=j+dy[k];

    if(x>0&&x<g.length&&y>0&&y<g[i].length){  在不超出边界的情况下

    if(g[x][y]==‘0’)  continue;   是0就跳过

    sink(x,y);  否则接着调方法

    }

    }

    return 1   返回陆地

    }

    }

    Processed: 0.025, SQL: 9