前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DFS与BFS

DFS与BFS

作者头像
晚上没宵夜
发布2020-04-24 15:21:03
4260
发布2020-04-24 15:21:03
举报
文章被收录于专栏:Howl同学的学习笔记

1. 树的结构

为了方便读者查看简洁的DFS和BFS逻辑,这里把树的基本结构统一抽取出来且不讨论树的实现

代码语言:javascript
复制
// 树的基本结构
public class Tree {

    // 树根
    private Node root;

    // 树的节点
    private class Node{
        int value;
        Node left;
        Node right;
        public Node (int value,Node left,Node right){
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }
    
    // 省略各种树内部操作,添加查找删除
}

2. DFS

深度优先搜索,从某个初始点出发,首先访问初始点,然后选择一个与该点相邻且没有访问过的点,接着以该相邻点为初始点,重复上述操作,直到所有点都被访问过了,即考虑访问到最深度,然后再回溯

递归实现

代码语言:javascript
复制
// 树的DFS日常经常使用,前序遍历即可
// dfs遍历,前序遍历即这个思想,到了叶子节点才回溯
public void dfs(){
    dfs(root);
}
private void dfs(Node node){
    if(node != null){
        System.out.println(node.value);
        dfs(node.left);
        dfs(node.right);
    }
}

递归虽然容易实现,但其递归过深容易发生StackOverflowError或OOM

迭代实现

代码语言:javascript
复制
// 迭代借用栈来实现,也是前序遍历思想,先访问根打印,然后访问左子树再右子树
// 具体访问顺序使用栈,这里得先右子树入栈,再左子树入栈
// 从栈弹出节点时也是先一样,重复上面步骤

public void dfsWithStack(){

    // LinkedList继承了Deque-->Queue有栈功能
    // 首先入栈根节点
    LinkedList<Node> list = new LinkedList();
    list.addFirst(root);  // 头插法,速度快

    // 栈不空则还有节点没遍历
    while(!list.isEmpty()){
        Node temp = list.removeFirst();  // 头删法
        System.out.println(temp.value);

        if (temp.right != null){
            list.addFirst(temp.right);
        }
        if(temp.left != null){
            list.addFirst(temp.left);
        }
    }
}

3. BFS

广度优先搜索,从某个节点出发,访问初始节点,接着访问初始节点的所有为未访问过的领接节点,再按照前一步的访问顺序访问每一个未访问过的领接节点,直至所有节点被访问过了

迭代实现

代码语言:javascript
复制
// 深度使用栈,而广度使用队列
// 转换到树中就是层级遍历

public void bfsWithStack(){
    Node node = root;
    if(node == null) return ;

    LinkedList<Node> list = new LinkedList();  // 队列
    list.addLast(root);  // 进队

    while(!list.isEmpty()){
        Node temp = list.removeFirst();  // 出队
        System.out.println(temp.value);

        if(temp.left != null){
            list.addLast(temp.left);  // 进队
        }
        if(temp.right != null){
            list.addLast(temp.right);  // 进队
        }
    }
}

4. 应用(后期补充)

BFS:最短链

DFS:走迷宫

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 树的结构
  • 2. DFS
  • 3. BFS
  • 4. 应用(后期补充)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档