题目 |
递归方式 |
思路:
每个TreeNode有四种情况:
①有右子树,没有左子树
②有左子树,没有右子树
③左右子树都有
④没有子树
我们要找的是最小深度,也就可以认为 没有子树
是循环的结尾
对于代码来说,也分为了这四种情况进行递归,这样一来就比较清楚了:
① 有右子树,没有左子树
直接将右节点作为根节点进行递归
② 有左子树,没有右子树
直接将左节点作为根节点进行递归
③ 左右子树都有
分别以左节点和右节点分别作为根节点进行递归,取较小的一个
④ 没有子树
直接返回本身的高度 1
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
if (root == null)
return 0;
if (root.left == null && root.right != null)
return minDepth(root.right) + 1;
else if (root.left != null && root.right == null)
return minDepth(root.left) + 1;
else if (root.left != null && root.right != null)
return Math.min(minDepth(root.left) + 1, minDepth(root.right) + 1);
else
return 1;
}
}
迭代方式 |
迭代的方式其实就是二叉树的层级遍历,从第一层开始,一层层的向下找,直到找到一个左右子树都没有的节点为止就退出,思路很简单
- 定义一个记录层数的值
- 使用队列存储每层的节点,每遍历完一层,记录的层数加一,添加下一层的节点
- 判断每个节点是否有左右节点,如果没有,则返回层数
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
int res = 0;
if (root == null) return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
res ++;
int size = queue.size(); // 这里的 size 记录的是每一层的节点的数量
while (size > 0) {
TreeNode node = queue.poll();
if (node.left == null && node.right == null) return res;
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
size--;
}
}
return res;
}
}