vlambda博客
学习文章列表

二叉树最大深度和最小深度

LeetCode 104. 二叉树的最大深度 

LeetCode 111. 二叉树的最小深度 

是两道和树深度相关的题目


最大深度分析

从根节点分析:

1)如果根节点就是空节点,则最大深度就是 0

2)如果根节点的左子节点且右子节点是空节点,那么最大深度就是 1

3)如果根节点的左子节点不为空,右子节点为空,则计算左子树的最大深度

4)如果根节点的右子节点不为空,左子节点为空,则计算右子树的最大深度

5)如果根节点的左子节点和右子节点都不是空节点,则需要依次计算左子树和右子树的最大深度,取两者最大值


public static int maxDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; } if (root.left != null && root.right != null) { return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; } if (root.left != null && root.right == null) { return maxDepth(root.left) + 1; } if (root.left == null && root.right != null) { return maxDepth(root.right) + 1;    }}    

可是上述方法怎么结束呢?


其实只要根节点的左子节点不为空,则需要计算左子节点的最大深度

同理只要根节点的右子节点不为空,则需要计算右子节点的最大深度


public static int maxDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; } int maxLeft; int maxRight; if (root.left != null) { maxLeft = maxDepth(root.left); } if (root.right != null) { maxRight = maxDepth(root.right); } return Math.max(maxLeft, maxRight) + 1;}

可是若 root.left == null 会导致 maxLeft 不能被初始化

同理若 root.right == null 会导致 maxRight 不能被初始化

会导致 Math.max(maxLeft, maxRight) + 1 编译报错


那 maxLeft 和 maxRight 可以怎么初始化呢?

可以初始化一个比较小的值,然后和 maxDepth 结果比较并取较大值


public static int maxDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; }    int maxLeft = Integer.MIN_VALUE; int maxRight = Integer.MIN_VALUE; if (root.left != null) { maxLeft = Math.max(maxDepth(root.left), maxLeft); } if (root.right != null) { maxRight = Math.max(maxDepth(root.right), maxRight); } return Math.max(maxLeft, maxRight) + 1;}


若不加 if (root.left != null) 会怎么样?

root.left == null 为怎么样?


maxDepth(root.left) 会再执行一次,但是因为 root.left == null ,所以直接返回 1 ,Math.max(maxDepth(root.left), maxLeft) 结果还是 1 ,

即 int maxLeft = maxDepth(root.left)

同理 int maxRight = maxDepth(root.right)


public static int maxDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; } int maxLeft = maxDepth(root.left);    int maxRight = maxDepth(root.right); return Math.max(maxLeft, maxRight) + 1;}


可以再优化一下,无需判断 root.left == null 或 root.right == null 


最大深度完整算法


public static int maxDepth(TreeNode root) { if (root == null) { return 0;    } int maxLeft = maxDepth(root.left); int maxRight = maxDepth(root.right); return Math.max(maxLeft, maxRight) + 1;}


最小深度分析

从根节点分析:

1)如果根节点就是空节点,则最小深度就是 0

2)如果根节点的左子节点且右子节点是空节点,那么最小深度就是 1

3)如果根节点的左子节点不为空,右子节点为空,则计算左子树的最小深度

4)如果根节点的右子节点不为空,左子节点为空,则计算右子树的最小深度

5)如果根节点的左子节点和右子节点都不是空节点,则需要依次计算左子树和右子树的最小深度,取两者最小值


public static int minDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; } if (root.left != null && root.right != null) {        return Math.min(minDepth(root.left), minDepth(root.right)) + 1; } if (root.left != null && root.right == null) { return minDepth(root.left) + 1; } if (root.left == null && root.right != null) { return minDepth(root.right) + 1;    }}    

可是上述方法怎么结束呢?


其实只要根节点的左子节点不为空,则需要计算左子节点的最小深度

同理只要根节点的右子节点不为空,则需要计算右子节点的最小深度


public static int minDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; }    int minLeft;    int minRight; if (root.left != null) {        minLeft = minDepth(root.left); } if (root.right != null) {        minRight = minDepth(root.right); }    return Math.min(minLeft, minRight) + 1;}

可是若 root.left == null 会导致 minLeft 不能被初始化

同理若 root.right == null 会导致 minRight 不能被初始化

会导致 Math.min(minLeft, minRight) + 1 编译报错


那 minLeft 和 minRight 可以怎么初始化呢?

可以初始化一个比较大的值,然后和 minDepth 结果比较并取较小值


public static int minDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; }    int minLeft = Integer.MAX_VALUE;    int minRight = Integer.MAX_VALUE; if (root.left != null) {        minLeft = Math.min(minDepth(root.left), minLeft); } if (root.right != null) {        minRight = Math.min(minDepth(root.right), minRight); }    return Math.min(minLeft, minRight) + 1;}


可以再优化一下


最小深度完整算法


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;}