【LeetCode】 111. 二叉樹的最小深度 遞歸方式 迭代方式

題目

在這裏插入圖片描述

遞歸方式

思路:
在這裏插入圖片描述
每個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;
    }
}

迭代方式

迭代的方式其實就是二叉樹的層級遍歷,從第一層開始,一層層的向下找,直到找到一個左右子樹都沒有的節點爲止就退出,思路很簡單

  1. 定義一個記錄層數的值
  2. 使用隊列存儲每層的節點,每遍歷完一層,記錄的層數加一,添加下一層的節點
  3. 判斷每個節點是否有左右節點,如果沒有,則返回層數
/**
 * 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章