1. 程式人生 > >LeetCode演算法題-Minimum Depth of Binary Tree(Java實現)

LeetCode演算法題-Minimum Depth of Binary Tree(Java實現)

這是悅樂書的第168次更新,第170篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第27題(順位題號是111)。給定二叉樹,找到它的最小深度。最小深度是沿從根節點到最近的葉節點的最短路徑上的節點數。葉子節點是沒有子節點的節點。例如:

給定二叉樹[3,9,20,null,null,15,7],

       3
      /  \
     9   20
        /  \
       15   7

返回其最小深度= 2。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

之前我們有解過最大深度的題,今天這道題相反,求最短路徑,那是不是直接將原來程式碼中的最大改為最小即可?如果你這樣試過,會發現根本不是那麼回事!

特殊情況一:當傳入的二叉樹為空時,最短路徑就是0。

特殊情況二:當傳入的二叉樹只有根節點時,最短路徑是1.

正常情況:當某一節點的左子節點為空時,這時我們需要求其右子節點的最短路徑;當某一節點的右子節點為空時,這時我們需要求其左子節點的最短路徑;當某一節點的左子節點和右子節點都不為空時,這時我們要求其左子樹和右子樹的最短路徑。

public int minDepth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    if ((root.left == null) && (root.right == null)) {
        return 1;
    }
    if (root.left == null) {
        return minDepth(root.right) + 1;
    }
    if (root.right == null) {
        return minDepth(root.left) + 1;
    }
    return 1+Math.min(minDepth(root.left), minDepth(root.right));
}

03 第二種解法

除了上面的遞迴外,我們依舊可以使用遍歷的方法。此解法與求最大深度時的第三種解法類似,也是利用佇列,只是多了一步判斷:當左右節點都為空時,此節點是葉子節點,需要更新最短路徑的值。

public int minDepth2(TreeNode root) {
    if (root == null) {
        return 0;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    int minDepth = Integer.MAX_VALUE;
    int depth = 1;
    while (!queue.isEmpty()) {
        int size = queue.size(); 
        while (size > 0) {
            TreeNode t = queue.poll();
            if (t.left != null) {
                queue.offer(t.left);
            }
            if (t.right != null) {
                queue.offer(t.right);
            }
            if (t.left == null && t.right == null) {
                minDepth = Math.min(minDepth, depth); 
            }
            size--;
        }
        depth++;
    }
    return minDepth;
}

04 小結

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!