zoukankan      html  css  js  c++  java
  • 什么是DFS和BFS?

    深度优先遍历DFS

    1、递归实现

    递归实现比较简单。也就是前序遍历,我们依次遍历当前节点,左节点,右节点即可,以此不断递归下去,直到叶节点(终止条件)。

    public class Solution {
        private static class Node {
            public int value;
            public Node left;
            public Node right;
        }
    
        public Node(int value, Node left, Node right) {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    
        public static void dfs(Node treeNode) {
            if(treeNode == null) {
                return;
            }
    
            // 遍历节点
            process(treeNode);
            // 遍历左节点
            dfs(treeNode.left);
            // 遍历右节点
            dfs(treeNode.right);
        }
    }

    递归的表达性很好,也很容易理解,不过如果递归层次过深,则很容易导致栈溢出。

    2、非递归实现(使用栈实现)

    对于二叉树的先序遍历,我们有以下思路:

    1、对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先得到左节点遍历,这是符合深度优先遍历的要求的)

    2、弹栈,拿到栈顶的节点,如果节点不为空,重复步骤1,如果为空,结束遍历。

    public static void dfsWithStack(Node root) {
        if(root == null) {
            return;
        }
    
        Stack<Node> stack = new Stack<>();
        // 先把根节点压栈
        stack.push(root);
        while(!stack.isEmpty()) {
            Node treeNode = stack.pop();
            process(treeNode)    // 遍历节点
            if(treeNode.right != null) {
                stack.push(treeNode.right);
            }
    
            if(treeNode.left != null) [
                stack.push(treeNode.left);
            }
        }
    }

    广度优先搜索BFS

    广度优先搜索,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

    private static void bfs(Node root) {
        if(root == null) {
            return;
        }
    
        Queue<Node> stack = new LinkedList<>();
        stack.add(root);
    
        while(!stack.isEmpty()) {
            Node node = stack.poll();
            System.out.println("value = " + node.value);
            Node left = node.left;
            if(left != null) {
                stack.add(left);
            }
    
            Node right = node.right;
            if(right != null) {
                stack.add(right);
            }
        }
    }
  • 相关阅读:
    图解插入排序--直接插入排序
    在项目中代替DevExpress(一)
    java web servlet
    一元夺宝项目设计(上)
    一元夺宝项目设计(中)
    一元夺宝项目设计(下)
    ORM之四:调用入口与调用示例
    ORM之三:DbProvider与DbFactory
    ORM之二:核心接口与扩展操作
    ORM之一:适合我的ORM
  • 原文地址:https://www.cnblogs.com/seeyoumiter/p/14163362.html
Copyright © 2011-2022 走看看