本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
输入: root = [2,null,3,null,4,null,5,null,6]
输出: 5
题目解析
思路一
我们先定义一个列表,然后将每一层节点都放进去这个列表中,再去循环,在开始前需要判断当前的数据是否为空,为空做出相应的擦走哦,然后进行循环列表,记录下当前列表长度,当前列表长度就是当前层的节点数,通过遍历当前层的节点,然后对节点进行操作,其中需要判断一下左右节点是否为空,如果为空则表示到底了叶子节点,需要返回路径上的节点数,然后再进行判断当前左节点和右节点,对其做出对应的操作,每遍历一次相对应的把记录层数自增1,最后返回自增的层数
/**
* @param {TreeNode} root
* @return {number}
*/
var minDepth = function(root) {
const p = [];
let step = 0;
if(root !== null){
p.push(root);
step++;
}
while(p.length > 0) {
const size = p.length;
for(let i = 0; i < size; i++){
const cur = p.shift();
if(cur.left === null && cur.right === null){
return step;
}
if(cur.left !== null){
p.push(cur.left);
}
if(cur.right !== null){
p.push(cur.right);
}
}
step++;
}
return step;
};
思路二
我们这里使用递归进行实现,首先判断当前数据是否为空,为空则返回当前数据层数为0,如果不为空则继续往下走,将数据的左节点和右节点进行递归,最后通过三则表达式进行判断出当前的深度,如果左右子树有一个没有,最小深度是左子树加右子树+ 1, 如果左右子树都有,最小深度是左子树或者右子树之中比较小的那个深度 + 1
/**
* @param {TreeNode} root
* @return {number}
*/
var minDepth = function(root) {
if(!root) return 0;
let m1 = minDepth(root.left);
let m2 = minDepth(root.right);
return root.left === null || root.right === null ? m1 + m2 + 1 : Math.min(m1, m2) + 1
};