二叉树的最小深度
文章目录
一、题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例
输入:root = [3,9,20,null,null,15,7]
输出:2
二、题解
方法1(递归)
- 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点
- 当 root 节点左右孩子都为空时,返回 1
- 当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度
- 当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值
/**
* @param {TreeNode} root
* @return {number}
*/
var minDepth = function (root) {
if (!root) { return 0 }
let minLeft = minDepth(root.left)
let minRight = minDepth(root.right)
// 其中一个节点为空,说明minLeft 和minRight 有一个必然为0,所以可以返回minLeft + minRight + 1;
return root.left == null || root.right == null ? minLeft + minRight + 1 : Math.min(minLeft, minRight) + 1;
};
方法2(深度优先遍历)
用深度优先遍历,要遍历所有节点,拿到所有叶子节点的层级
/**
* @param {TreeNode} root
* @return {number}
*/
var minDepth = function (root) {
let res
const dfs = (n,l) => {
if (!n) return
if (!n.left && !n.right) {
res = res? Math.min(res,l) : l
}
dfs(n.left, l + 1)
dfs(n.right, l + 1)
}
dfs(root, 1)
return res ? res : 0
};
方法3(广度优先遍历)
- 广度优先遍历整棵树,并记录每个节点的层级
- 遇到叶子结点,返回节点层级,停止遍历 — 不用遍历每一个节点
var minDepth = function(root) {
if(!root) return 0
const q = [[root,1]];
while (q.length > 0) {
const [n,level] = q.shift();
if (!n.left && !n.right) {
// 遇到第一个叶子节点
return level
}
n.left && q.push([n.left, level+1])
n.right && q.push([n.right, level+1])
}
};