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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值