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 ;