leetcode每天一题:【二叉树的最小深度】(简单)

208 阅读2分钟

这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

提供一个二叉树,需要找到这个二叉树的最小深度。然后返回该值。

怎么算最小深度? 就是二叉树的根节点到叶子节点的最短距离。(叶子节点就是没有左右子节点的节点

补充: 如果没有根节点,则返回 0

我画个图来说明下:(灵魂画手前来报到😀)

最小深度为1(根节点)->2(叶子节点),所以返回2

image.png

最小深度为1(根节点)->3->4->5->6(叶子节点),所以返回5

image.png

思路分析

第一种方法(递归法)

我们定义一个最小深度的变量minLevel,默认是0

如果没有根节点的时候,返回 0

定义一个find函数来寻找最小深度

在find函数中,如果当前节点为null,则返回。

然后判断当前节点是不是叶子节点?

就是当前节点有值,但是没有左边树,并且也没有右边树。

所以如果是叶子节点的时候

我们判断minLevel是否为0,或者minLevel是否大于当前层级,如果是,则把当前层级赋值给minLevel

然后继续递归遍历当前节点的左边树以及右边树。

递归遍历结束后

最终得到的minLevel就是二叉树的最小深度。

代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function (root) {
  let minLevel = 0
  if (!root) return minLevel
  function find (root, level) {
    if (!root) return
    if (root && !root.left && !root.right) {
      if (!minLevel || minLevel > level) minLevel = level
      return
    }
    find(root.left, level + 1)
    find(root.right, level + 1)
  }
  find(root, minLevel + 1)
  return minLevel
};

image.png

第二种方法(递归法)

这个方法会利用Math.min方法取最小值。

首先如果当前节点为null则返回 0

如果当前节点是叶子节点则返回 1

定义一个变量res, 赋值为最大安全整数。

如果当前节点有左边树,则使用当前节点的左边树继续判断,递归调用得到到叶子节点的深度,和res比较,然后取最小的替换res

同理对当前节点的右边树也是如此。

每次递归

如果当前节点不是叶子节点,则返回res加 1,代表着深度加 1

如果是叶子节点则返回 1

递归遍历结束后,返回的就是二叉树的最小深度。

代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function (root) {
  if (!root) return 0
  if (!root.left && !root.right) return 1
  let res = Number.MAX_SAFE_INTEGER
  if(root.left) {
    res = Math.min(res, minDepth(root.left))
  }
  if(root.right) {
    res = Math.min(res, minDepth(root.right))
  }
  return res + 1
};

image.png