力扣深度优先搜索练习题(二叉树的最大深度、二叉树的最小深度)

84 阅读3分钟

二叉树的最大深度

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ma…

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

代码

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

思路分析

  1. 首先,如果二叉树为空(即根节点为null),则最大深度为0。

  2. 否则,我们递归计算左子树的最大深度和右子树的最大深度,然后取其中较大的值,并加1,表示当前节点所在的路径长度。最后,返回这个值作为整个二叉树的最大深度。

  3. 递归的终止条件是当遍历到叶子节点时,返回0,即表示到达叶子节点的路径长度为0。

该算法的时间复杂度是O(n),其中n是二叉树中的节点个数,因为我们需要遍历所有的节点来计算最大深度。空间复杂度是O(log n),即递归调用栈的空间。

二叉树的最小深度

来源:力扣(LeetCode) 链接:leetcode.cn/problems/mi…

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

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

示例 1:

图片.png

输入:root = [3,9,20,null,null,15,7]

输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]

输出:5

提示:

  • 树中节点数的范围在 [0, 105] 内
  • -1000 <= Node.val <= 1000

代码

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        // 当前节点为叶子节点时,返回1
        if (root.left == null && root.right == null) {
            return 1;
        }
        // 左子树为空时,返回右子树的最小深度加1
        if (root.left == null) {
            return minDepth(root.right) + 1;
        }
        // 右子树为空时,返回左子树的最小深度加1
        if (root.right == null) {
            return minDepth(root.left) + 1;
        }
        // 左右子树都不为空时,返回左右子树中最小深度的较小值加1
        return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
    }
}

思路分析

  1. 首先,如果二叉树为空(即根节点为null),则最小深度为0。

  2. 当遍历到叶子节点时,即左子树和右子树都为空时,返回1,表示到达叶子节点的路径长度为1。

  3. 对于非叶子节点,我们分别递归计算左子树和右子树的最小深度。如果其中一个子树为空,我们就返回另一个子树的最小深度加1。如果两个子树都不为空,我们就返回左右子树中最小深度的较小值加1。

  4. 最后,返回根节点的最小深度作为整个二叉树的最小深度。

该算法的时间复杂度是O(n),其中n是二叉树中的节点个数,因为我们需要遍历所有的节点来计算最小深度。空间复杂度是O(log n),即递归调用栈的空间。