二叉樹 - 最大深度和最小深度


LeetCode 二叉樹的最大深度

LeetCode 二叉樹的最小深度

我們知道完全二叉樹,是可以根據節點數量進行計算出深度的, 但是非完成二叉樹呢 , 他就不滿足了,

樹結構體

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

1. 二叉樹的最大深度

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

/**
 * 最大深度
 *
 * @param root 根節點
 * @return 最大深度
 */
public static int maxDepth(TreeNode root) {
    // 為空直接返回0
    if (root == null) return 0;
    
    // 遞歸
    int left = maxDepth(root.left);
    int right = maxDepth(root.right);
    
    // (left <= right) ? left : right 這個就是取最大值Math.man()
    return ((left >= right) ? left : right) + 1;
}

首先我畫一張圖 大家理解一下 ,

所以他的意思就是 當我找到一個葉子節點 , 我就+1 (在那個分支上) , 然后返回的時候 , 大的+1 ; 所以我們想想我們計算樹的深度是不是這么計算了 從 1->3->4 , 從4開始返回+1 (加一是記錄深度), 每次遇到根節點都要比較一下, 取最大值然后再加一

2. 二叉樹的最大深度

​ 最小深度是從根節點到最近葉子節點(空節點當然不算了)的最短路徑上的節點數量說明: 葉子節點是指沒有子節點的節點。

正常人的思路都是下面這個, 前提是做了前面那道題 , 直接答案反過來么 , 但是我們先往下看

/**
 * 最小深度
 *
 * @param root
 * @return
 */
public static int minDepth(TreeNode root) {
    if (root == null) return 0;
    int left = minDepth(root.left);
    int right = minDepth(root.right);
    // (left <= right) ? left : right 這個就是取最小值Math.min()
    return ((left <= right) ? left : right) + 1;
}

下面是程序的基本執行流程

看似這個問題和上面那個問題相反 ,但是執行起來還是不好想的, 比如取最短 ,是不是我們拿這個題為例子, 每次遇到根節點都進行比較一下取最小,然后+1 , 其實目的就是為了找到最短的分支 .

有一種情況比較特殊 : 就是他這里說是 根節點到最近葉子節點的最短路徑 , 所以比如我們上面畫的是錯的, 因為 null不算是葉子節點, 他為空 ,所以上面那個題葉子節點是4 , 此時樹的最小深度是3 ,所以不單單是我們上述題反過來那么簡單 ,上述例子出來是1 .

所以正確的代碼是 :

/**
 * 最小深度 , 從根節點到最近葉子節點的最短路徑上的節點數量。
 *
 * @param root 根節點
 * @return 到最近葉子節點的最短距離
 */
public static int minDepth(TreeNode root) {
    if (root == null) return 0;

    int left = minDepth(root.left);
    int right = minDepth(root.right);
	// 特殊地方
    if (left == 0 || right == 0) return left + right + 1;

    return ((left <= right) ? left : right) + 1;
}

執行流程就是下面這個 , 因為空的葉子節點不算, 所以我們遇到空葉子節點性需要(不知道是左是右)排除,就是left + right + 1 ,可能left=0或者right=0 , 兩者都等於或者

有0則加1 , 無0則取最下+1 ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM