二叉树--二叉树最小深度

文章前言:如果有小白同学还是对于二叉树不太清楚,作者推荐:

二叉树的初步认识_加瓦不加班的博客-CSDN博客

二叉树--二叉树最小深度_第1张图片

二叉树--二叉树最小深度_第2张图片

 

后序遍历求解

public int minDepth(TreeNode node) {
    if (node == null) {
        return 0;
    }
    int d1 = minDepth(node.left);
    int d2 = minDepth(node.right);
    //不应该再把为 null 子树的深度 0 参与最小值比较
    //第一种写法:
    //if (d1 == 0 || d2 == 0) {
    //    return d1 + d2 + 1;
    //}
    //第二种写法:
    if(d1==0){//当右子树为NULL
        return d2+1;//返回左子树深度+1
    }
    if(d2==0){//当左子树为NULL
        return d1+1;//返回右子树深度+1
    }
    //只有两边子树都不为null时
    return Integer.min(d1, d2) + 1;
}

相较于求最大深度,应当考虑:

  • 当右子树为 null,应当返回左子树深度加一

  • 当左子树为 null,应当返回右子树深度加一

上面两种情况满足时,不应该再把为 null 子树的深度 0 参与最小值比较,例如这样

    1
   /
  2
  • 正确深度为 2,若把为 null 的右子树的深度 0 考虑进来,会得到错误结果 1

    1
     \
      3
       \
        4
  • 正确深度为 3,若把为 null 的左子树的深度 0 考虑进来,会得到错误结果 1

层序遍历求解

遇到的第一个叶子节点所在层就是最小深度

二叉树--二叉树最小深度_第3张图片

例如,下面的树遇到的第一个叶子节点 3 所在的层就是最小深度,其他 4,7 等叶子节点深度更深,也更晚遇到

     1
    / \     
   2   3
  / \
 4   5 
    /
   7 

代码:

public int minDepth(TreeNode root) {
    if(root == null) {
        return 0;
    }
    Queue queue = new LinkedList<>();
    queue.offer(root);
    int level = 0;
    while (!queue.isEmpty()) {
        level++;
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            //找寻叶子节点:左右孩子都是Null就是叶子节点
            if (node.left == null && node.right == null) {
                return level;
            }
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
    }
    return level;
}

效率会高于之前后序遍历解法,因为找到第一个叶子节点后,就无需后续的层序遍历了

你可能感兴趣的:(数据结构,算法,leetcode,数据结构,java)