这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战
题目描述
提供一个二叉树,需要找到这个二叉树的最小深度。然后返回该值。
怎么算最小深度? 就是二叉树的根节点到叶子节点的最短距离。(叶子节点就是没有左右子节点的节点)
补充: 如果没有根节点,则返回 0。
我画个图来说明下:(灵魂画手前来报到😀)
最小深度为1(根节点)->2(叶子节点),所以返回2
最小深度为1(根节点)->3->4->5->6(叶子节点),所以返回5
思路分析
第一种方法(递归法)
我们定义一个最小深度的变量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
};
第二种方法(递归法)
这个方法会利用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
};