本题是找到二叉树的最小深度, 即找到从一个叶子结点到根结点的最小路径.
思路一 : 递归思路
class Solution {
public int minDepth(TreeNode root) {
if (root == null)
return 0;
int left = minDepth(root.left);
int right = minDepth(root.right);
return (left == 0 || right == 0) ? left + right + 1 : Math.min(left, right) + 1;
}
}
这里当出现左子树或者右子树为 0 时, 巧妙地利用 0 值直接相加.
思路二 : 非递归思路
class Solution {
public int minDepth(TreeNode root) {
if (root == null)
return 0;
Queue<TreeNode> q = new ArrayDeque<>();
q.add(root);
int result = 0;
while(!q.isEmpty()) {
result++;
int k = q.size();
for (int i = 0; i < k; i++) {
TreeNode curr = q.peek();
if (curr.left != null) q.add(curr.left);
if (curr.right != null) q.add(curr.right);
q.poll();
if (curr.left == null && curr.right == null) return result;
}
}
return -1;
}
}
这里是用的队列而不是栈来实现的, 这里的本质是一层一层的遍历二叉树, 这种情况下用的是队列来实现, 每一层一层的需要全部遍历完才能进入下一层.