一、题目描述
原文链接:111. 二叉树的最小深度
具体描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
**说明:**叶子节点是指没有子节点的节点。
示例 1:
示例 2:
提示:
- 树中节点数的范围在 [0, 10^5] 内
- -1000 <= Node.val <= 1000
二、思路分析
其实之前我们做过一次这道题,但是用的层次遍历,层次遍历那是真香呀,可以一打十题!可以看看这篇文章!
我们还了解过迭代遍历和递归遍历!那我们在聊一聊这两个!
首先递归遍历,老样子,三部曲:
- 参数和返回值类型,返回值不用犹豫就是int,参数的话需要传递二叉树,而且还需要传递深度,所以两个参数
public int getMinDepth(TreeNode root, int deepth)
- 中止条件就是如果树为空则返回当前深度!
- 单层遍历(我们用后序遍历举例)就是第一遍历左子树,第二遍历右子树,第三就是如果左子树为空,右子树不为空则返回左子树的深度(毕竟最小深度嘛),如果左子树不为空,右子树为空,则然会右子树高度,否则返回左右子树的最小值!
迭代遍历的话,需要注意的点就是左右子树都为空才返回深度!
三、AC代码
递归做法:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
return getMinDepth(root, 0);
}
public int getMinDepth(TreeNode root, int deepth){
if (root == null) return deepth;
int leftDeepth = getMinDepth(root.left, deepth + 1);
int rightDeepth = getMinDepth(root.right, deepth + 1);
if (root.left == null && root.right != null){
return rightDeepth;
}
if (root.left != null && root.right == null){
return leftDeepth;
}
return leftDeepth > rightDeepth ? rightDeepth : leftDeepth ;
}
}
迭代做法:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
if (root != null) deque.offer(root);
int depth = 0;
while (!deque.isEmpty()){
int len = deque.size();
depth++;
while (len > 0){
TreeNode tmpNode = deque.poll();
if (tmpNode.left != null) deque.offer(tmpNode.left);
if (tmpNode.right != null) deque.offer(tmpNode.right);
if (tmpNode.left == null && tmpNode.right == null) return depth;
len--;
}
}
return depth;
}
}
四、总结
- 二叉树的迭代和递归遍历复习!