LeetCode广度、深度优先搜索

作者: 奔跑吧李博 | 来源:发表于2022-12-20 23:37 被阅读0次
    广度优先搜索

    广度优先搜索(也称宽度优先搜索,缩写BFS即即Breadth First Search)是连通图的一种遍历算法。这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和广度优先搜索类似的思想。其属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。基本过程,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。

    所采用的策略可概况为越早被访问到的顶点,其邻居顶点越早被访问。于是,从根顶点s的BFS搜索,将首先访问顶点s;再依次访问s所有尚未访问到的邻居;再按后者被访问的先后次序,逐个访问它们的邻居。一般用队列queue数据结构来辅助实现BFS算法。

    二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。


    class Solution {
        /**
         * 思路:用队列存储每一层的数字,然后用变量记录当前层级元素的个数
         * 创建当前层级集合,遍历当前层级的size,弹出当列当前数添加到集合,判断当前节点左右节点是否为空,不为空加入到当前队列中
         * 注:每一层取当前层是从队列取前面数,存下一层是放入队列尾部,所以不会有冲突
         * @param root
         * @return
         */
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            Queue<TreeNode> queue = new ArrayDeque<>();
            if (root != null) {
                queue.add(root);
            }
    
            while(!queue.isEmpty()) {
                //如果当前队列不为空,将当前队列的当前层弹出队列,存储数组中
                int size = queue.size();
                List<Integer> curLevel = new ArrayList<>();
                for (int i=0;i<size;i++) {
                    //当前层级可以继续弹出
                    TreeNode node = queue.poll();
                    curLevel.add(node.val);
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                    }
                }
                res.add(curLevel);
            }
            return res;
        }
    }
    
    深度优先搜索

    深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用栈stack数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

    二叉树的最大深度

    给定一个二叉树,找出其最大深度。

    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

    说明: 叶子节点是指没有子节点的节点。

    题解:
    class Solution {
         /**
         * 节点为空时说明高度为 0,所以返回 0;节点不为空时则分别求左右子树的高度的最大值,同时加1表示当前节点的高度,返回该数值
         * @param root
         * @return
         */
        public int maxDepth(TreeNode root) {
            if (root == null) {
                return 0;
            } else { //获取左子树的最大深度和右子树最大深度对比,选取大的,再+1,为当前节点的最大深度
                return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
            }
        }
    }
    ``
    
    #### [二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/)
    给定一个二叉树,找出其最小深度。
    
    最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
    
    说明:叶子节点是指没有子节点的节点。
    
    #####题解:
    

    class Solution {
    public int minDepth(TreeNode root) {
    //思路:得到树的最底层的叶子节点,即左右节点都为null,设置深度为1,从下往上找
    //当前节点深度为取左右节点的深度较小值,+1,即当前节点最小深度作为函数返回值,该函数为递归调用函数
    if(root == null) {
    return 0;
    }

        if(root.left == null && root.right == null) {
            return 1;
        }
    
        int mindepth = Integer.MAX_VALUE;
        if(root.left != null) {
            //左子节点不为空,得到左子节点的深度
            mindepth = Math.min(minDepth(root.left), mindepth);
        }
        if(root.right != null) {
            //右子节点不为空,得到右子节点的深度
            mindepth = Math.min(minDepth(root.right), mindepth);
        }
        return mindepth+1;
    }
    

    }

    
    
    
    
    
    

    相关文章

      网友评论

        本文标题:LeetCode广度、深度优先搜索

        本文链接:https://www.haomeiwen.com/subject/tjfuqdtx.html