111. 二叉树的最小深度

题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

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

方法1:深度优先搜索

原理:深度优先搜索(Depth First Search)是一种遍历图的算法,它从图中的某个顶点出发,沿着一条路径不断向下探索,直到无法继续深入为止,然后回溯到上一个顶点,继续探索其他路径,直到所有顶点都被访问过为止, 所有的顶点都被压入中。栈:先进后出。

思路:使用深度优先搜索,遍历整棵树,记录最小的深度。对于每一个非叶子节点,分别计算其左右叶子结点的最小叶子结点深度。通过递归的方式解决该问题。但递归在运行时,值的变化很难把握。

   public int minDepth(TreeNode root) {
if(root == null){
return 0;
}
if (root.left == null && root.right == null) {
return 1;
}
// 最小深度
int min_depth = Integer.MAX_VALUE;
// 左子树节点
if(root.left != null){
min_depth = Math.min(minDepth(root.left), min_depth);
}
// 右子树节点
if(root.right != null){
min_depth = Math.min(minDepth(root.right), min_depth);
}
return min_depth + 1;
}

时间复杂度为O(N),因为二叉树中,每一个子节点都被访问过。平均空间复杂度O(logN)。  

方法2:广度优先搜索

原理:广度优先搜索(Breadth First Search)是一种遍历图的算法,它从图中的某个顶点出发,沿着一条路径不断向下探索,直到无法继续深入为止,然后回溯到上一个顶点,继续探索其他路径,直到所有顶点都被访问过为止, 所有的顶点都被压入队列中。队列:先进先出。

思路:使用广度优先搜索,当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。

class QueueNode{
// 定义属性
TreeNode node;
int depth;
// 构造函数
public QueueNode(TreeNode node,int depth){
this.node = node;
this.depth = depth;
}
}
public int minDepth(TreeNode root) {
if(root == null){
return 0;
}
Queue<QueueNode> queue1 = new LinkedList<QueueNode>();
queue1.offer(new QueueNode(root,1));// 先将第一个根节点放入队列中
while(!queue1.isEmpty()){
// 弹出首个元素
QueueNode nodedepth = queue1.poll();
TreeNode node = nodedepth.node;
int depth = nodedepth.depth;
if (node.left == null && node.right == null) {
// 最终的出口一定在这里
return depth;
}
// 左子树节点
if(node.left != null){
// 将节点放入队列中 depth = depth + 1
queue1.offer(new QueueNode(node.left,depth + 1));
}
// 右子树节点
if(node.right != null){
// 将节点放入队列中 depth = depth + 1
queue1.offer(new QueueNode(node.right,depth + 1));
}
}
return 0;
}

时间复杂度为O(N),因为二叉树中,每一个子节点都被访问过。平均空间复杂度O(N)。 

Java 深度优先搜索 and 广度优先搜索的算法原理和代码展示的更多相关文章

  1. DFS_BFS(深度优先搜索 和 广度优先搜索)

    package com.rao.graph; import java.util.LinkedList; /** * @author Srao * @className BFS_DFS * @date ...

  2. AC-BM算法原理与代码实现(模式匹配)

    AC-BM算法原理与代码实现(模式匹配) AC-BM算法将待匹配的字符串集合转换为一个类似于Aho-Corasick算法的树状有限状态自动机,但构建时不是基于字符串的后缀而是前缀.匹配 时,采取自后向 ...

  3. java深度搜索与广度优先搜索

    图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class GraphNode { public List<GraphEdge> ...

  4. 【js数据结构】图的深度优先搜索与广度优先搜索

    图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...

  5. 集成学习值Adaboost算法原理和代码小结(转载)

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...

  6. 【机器学习】Apriori算法——原理及代码实现(Python版)

    Apriopri算法 Apriori算法在数据挖掘中应用较为广泛,常用来挖掘属性与结果之间的相关程度.对于这种寻找数据内部关联关系的做法,我们称之为:关联分析或者关联规则学习.而Apriori算法就是 ...

  7. stacking算法原理及代码

    stacking算法原理 1:对于Model1,将训练集D分为k份,对于每一份,用剩余数据集训练模型,然后预测出这一份的结果 2:重复上面步骤,直到每一份都预测出来.得到次级模型的训练集 3:得到k份 ...

  8. 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法

    Graph Search and Connectivity Generic Graph Search Goals 1. find everything findable 2. don't explor ...

  9. Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索

    Depth-first search Depth-first search (DFS) is an algorithm for traversing or searching tree or grap ...

  10. DFS或BFS(深度优先搜索或广度优先搜索遍历无向图)-04-无向图-岛屿数量

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

随机推荐

  1. MAC地址、IP地址与子网———计算机网络

    计算机具有强大的功能.除了体现与计算机本身具有的计算能力外,其他的功能大多是基于与其他计算机联网提供的. 然而,计算机之间的联网不是一根网线就能解决嘛? 答案当然是否定的.实际上计算机间的交流过程十分 ...

  2. O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?

    本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作. 在流程表单设计界面, ...

  3. asp.net core如何获取客户端IP地址

    客户端直接访问服务器 直接通过HttpContext.Connection.RemoteIpAddress获取客户端Ip [HttpGet] [Route("GetClientIP" ...

  4. eclipse在主题商城下载安装黑色主题

    Eclipse配置黑色主题方法: 1. 借用国外一个Elipse主题网站分享的主题配置文件来配置一个黑色的主题. 主题网址 2. 在这个网站下载自己喜欢的主题,单击主题进入下载页面,建议大家选择EPF ...

  5. 压制GIF做的一点点小尝试 以及ezgif的基本功能使用

    事情的起因 首先群友给我整了个loli莉音的视频 很可爱 但是用qq接收的视频没法一直在那边kawaii 图片本身很小其实 但是转gif就很大 转出来的gif的大小就大的唏嘘 寻找问题 这就是mp4的 ...

  6. PTA 21级数据结构与算法实验6—图论

    目录 7-1 邻接矩阵表示法创建无向图 7-2 邻接表创建无向图 7-3 图深度优先遍历 7-4 单源最短路径 7-5 列出连通集 7-6 哈利·波特的考试 7-7 家庭房产 7-8 森森美图 7-9 ...

  7. redis 使用 nologin 用户启动

    添加不可登录的redis用户 sudo useradd -M -s /sbin/nologin redis 为redis新建目录,并设置属性 mkdir -p /data/redis &&am ...

  8. 【VS Code 与 Qt6】QAction 类的一些事

    QAction 类表示用户命令的一种抽象,包括命令文本.图标.命令触发后要执行的代码.菜单.工具栏按钮往往存在相同的功能,将这些命令独立抽出来,放到 QAction 以象上,可避免编写重复的代码.比如 ...

  9. 2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。

    2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量. 其中的每一个数字出现的频率都相同. 答案2023-07-29: 大体步骤如下: 1.初始化变量base为固定值10 ...

  10. 若依前后端分离版:增加新的登录接口和新的用户表,用于小程序或者APP获取token,并使用若依的验证方法

    相关原创链接直接放这: 基于若依框架springsecurity添加多种用户登录解决方案(springsecurity多用户登录:前端用户.后端用户)_若依多用户表登录_云优的博客-CSDN博客 若依 ...