LeetCode广度、深度优先搜刮

分享
藏宝库编辑 2024-9-13 02:23:41 117 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;}}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 13:48, Processed in 0.196462 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表