題目 |
遞歸方式 |
思路:
每個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;
}
}