二叉树的最小深度
问题描述
来源:LeetCode第111题
难度:简单
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。
BFS解决
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。如上图所示,我们可以使用 BFS 一层一层的遍历,在第一次遇到叶子节点的时候,直接返回这个叶子节点的层数即可。
代码语言:javascript代码运行次数:0运行复制public int minDepth(TreeNode root) {
if (root == null)
return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int level = 0;
while (!queue.isEmpty()) {
level++;// 每往下一层就加 1
// 当前层的节点个数
int size = queue.size();
while (size-- > 0) {
TreeNode cur = queue.poll();//出队
// 如果当前节点 cur 是叶子节点,直接返回level即可
if (cur.left == null && cur.right == null)
return level;
if (cur.left != null)
queue.add(cur.left);
if (cur.right != null)
queue.add(cur.right);
}
}
return -1;
}
DFS解决
在来看下 DFS 解决思路,这个和二叉树的最大深度类似,首先递归计算左右子树的结果,最后在合并,看下代码。
代码语言:javascript代码运行次数:0运行复制public int minDepth(TreeNode root) {
if (root == null)
return 0;
// 递归计算左右子树的结果
int left = minDepth(root.left);
int right = minDepth(root.right);
// 这里合并
}
这里的关键点是怎么合并,计算二叉树最大深度的时候《二叉树的最大深度》,最后我们取的是两个子节点的最大值,那么计算二叉树最小深度的时候是不是取两个节点的最小深度呢,明显不是的。比如上面图 (2) 中,节点 1 没有左子节点,所以节点 1 的左子树计算的结果为 0 ,右子树计算的结果为 2 ,如果取最小值在加 1 结果就是 1 ,但很明显这棵树的最小深度不是 1 。
解这题之前我们首先要明白什么是最小深度,就是从根节点到最近叶子节点的最短路径上的节点数量,这里要注意的到叶子节点,所以如果有两个子节点的时候我们取他们两个的最小值,但如果只有一个子节点的时候,我们取不为空的那个子节点计算的结果,如果两个子节点都为空,直接取 0 就行了 ,来看下代码:
代码语言:javascript代码运行次数:0运行复制public int minDepth(TreeNode root) {
if (root == null)
return 0;
int left = minDepth(root.left);
int right = minDepth(root.right);
// 两个子树至少有一个为空的情况
if (left == 0 || right == 0)
return left + right + 1;
// 两个子树都不为空
return Math.min(left, right) + 1;
}
大家可以关注我的视频号,每晚直播刷题。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2023-10-23,如有侵权请联系 cloudcommunity@tencent 删除二叉树introot遍历视频
发布评论