当前位置: 首页 > news >正文

13-二叉树最小深度-深度优先(DFS)

一、定义

什么是二叉树的最小深度?

二叉树的最小深度是指从根节点到最近的叶子节点的最短路径上的节点数。叶子节点是指没有子节点的节点。

举个例子:

     1
    / \
   2   3
  / 
 4

这棵树的最小深度是 2,因为从根节点 1 到叶子节点 3 的路径最短,只需要经过 1 和 3 两个节点。


深度优先搜索(DFS)的思路

深度优先搜索是一种遍历树的方法,它的特点是一条路走到底,直到遇到叶子节点或者无法继续前进时,再回溯到上一个节点,尝试其他路径。

用 DFS 求最小深度的步骤如下:

  1. 从根节点开始,递归地遍历它的左子树和右子树。

  2. 如果当前节点是叶子节点(即没有左子树和右子树),返回深度 1。

  3. 如果当前节点只有左子树或右子树,继续递归遍历存在的子树。

  4. 如果当前节点有左右子树,分别递归计算左右子树的最小深度,然后取较小的那个,再加上当前节点的深度 1。

  5. 最终返回最小深度


举个例子

假设我们有一棵树:

     1
    / \
   2   3
      / \
     4   5

用 DFS 计算最小深度的过程如下:

  1. 从根节点 1 开始,递归遍历左子树 2

    • 节点 2 是叶子节点,返回深度 1。

  2. 递归遍历右子树 3

    • 节点 3 有左右子树,递归遍历左子树 4

      • 节点 4 是叶子节点,返回深度 1。

    • 递归遍历右子树 5

      • 节点 5 是叶子节点,返回深度 1。

    • 节点 3 的最小深度是 min(1, 1) + 1 = 2

  3. 根节点 1 的最小深度是 min(1, 2) + 1 = 2

所以这棵树的最小深度是 2。

二,举例

计算该二叉树的最小深度:

            1
           / \
          2   3
         / \   \
        4   5   6
                 \
                  7
import javax.swing.tree.TreeNode;

public class demo01 {
    public static void main(String[] args) {
        TreeNode node7 =new TreeNode(7,null,null);
        TreeNode node6 =new TreeNode(6,node7,null);
        TreeNode node5 =new TreeNode(5,null,null);
        TreeNode node4 =new TreeNode(4,null,null);
        TreeNode node3 =new TreeNode(3,node6,null);
        TreeNode node2 =new TreeNode(2,node4,node5);
        TreeNode node1 =new TreeNode(1,node2,node3);
        System.out.println(minDepth(node1));
    }

    public static int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        if (root.left == null && root.right == null) {
            return 1;
        }
        int min=Integer.MAX_VALUE;
        if(root.left != null) {                      //左边节点不为空
            min=Math.min(minDepth(root.left),min);    //算出左边节点
        }
        if(root.right != null) {                        //左边节点不为空
            min=Math.min(minDepth(root.right),min);   //算出左边节点
        }
        return min+1;
    }

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val,TreeNode left,TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
}

相关文章:

  • 机器视觉--索贝尔滤波
  • 4.3 数据预处理策略:填充与截断的工程实践指南
  • SQL Server 运算符优先级
  • [代码调试]安装Text2Image(stable diffusion)模型环境的踩坑记录
  • Vue 3 30天精进之旅:Day 28 - 回顾与总结
  • hash哈希函数(散列函数)、hash table 哈希表(散列表)
  • Chapter 3 Differential Voltage Current amplifiers
  • 单元测试junit5
  • 五十天精通硬件设计第35天-高精密仪器PCB设计Guard Ring设计
  • ”无痕模式“真的无痕?
  • Redis的简单使用
  • mybatis-动态SQL
  • Python 发布 Web 应用的常见方法及详细步骤
  • [题解]2024ICPC上海站-In Search of the Ultimate Artifact
  • K8S之脚本管理(Script Management for k8s)
  • aistdio部署deepseek-r1纯教程
  • 地表放置机场和飞机(十)
  • 基于JavaScript的实时数据监控仪表盘开发实践
  • QT C++ modbus 两个字 合成 32位整数
  • DEX-EE三指灵巧手:扩展AI与机器人研究的边界
  • 拿出压箱底作品,北京交响乐团让上海观众享受音乐盛宴
  • 江西省直机关工委副书记熊亮华履新宜春市委常委、宣传部部长
  • 金地集团:今年前4个月实现销售额109.3亿元,同比下降52.44%
  • 眉山“笑气”迷局:草莓熊瓶背后的隐秘与危机
  • 上海发布预付卡消费“10点提示”:警惕“甩锅闭店”套路
  • 罗氏制药全新生物制药生产基地投资项目在沪启动:预计投资20.4亿元,2031年投产