路徑總和、二叉樹的最小深度(力扣第112、111題)
題目:
給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明:葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
返回true
, 因為存在目標和為 22 的根節點到葉子節點的路徑5->4->11->2
。
分析:
題目是求是否存在某一條從根節點到葉子節點的路徑,這個路徑上的所有節點的值相加等於目標和。從根節點到葉子節點,本質就是樹的遍歷,那麼可以定義一個變數,用於記錄從根節點開始遍歷路徑上的所有節點的和,判斷當遇到葉子節點的時候是否和目標和相等,如果相等,那麼就將記錄最終結果的不二型別的成員變數置為true,否則返回繼續遍歷。
程式碼:
private boolean isTargrt = false; public boolean hasPathSum(TreeNode root, int sum) { if (root == null){ return false; } traversalTree(root,0,sum); return isTargrt; } private void traversalTree(TreeNode root,int curSum,int sum){if (root == null){ return; } curSum += root.val; if (root.right == null && root.left == null){ if (curSum == sum){ isTargrt = true; } return; } traversalTree(root.left,curSum,sum); traversalTree(root.right,curSum,sum); }
題目:二叉樹的最小深度
給定一個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明:葉子節點是指沒有子節點的節點。
示例:
給定二叉樹[3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回它的最小深度 2
分析:
求最小深度和求樹的高度正好是相反的,求樹的高度是從根節點到最遠葉子節點的最長路徑上的節點數,而最小深度是從根節點到最近葉子節點的最短路徑上的節點數。都是與樹的深度計算相關,但是一個是最短的,一個是最長的。求樹的高度是通過計算左右子樹的最大深度然後加1得出最終答案的,那麼本題可以通過計算左右子樹最小深度然後加1得出最終的答案。
不過這裡需要注意的是,因為我們要求的最小的深度,所以返回值一定是取左右子樹最小深度的最小值然後加1,但是可能存在某個子樹為null的情況,比如某個節點,其只有左子樹,而沒有右子樹,那麼右子樹的最小深度一定是0,而左子樹的最小深度肯定大於0,按照上面的返回值計算方式,最終返回的右子樹的最小深度值加1,即1,但是這是不正確的,為什麼呢?因為右子樹根本就沒有葉子節點,右子樹不存在,也就不可能有葉子節點,葉子節點只可能在左子樹才有,所以需要再專門有個討論,就是訪問到某個節點的時候,計算完這個節點的子樹的最小深度,判斷兩個子樹是否最小深度為0,如果有為0,那就直接返回不為0的子樹的最小深度值加1。這就是與求高度不同的地方。特別注意!!!
程式碼:
public int minDepth(TreeNode root) { if (root == null){ return 0; } int left_length = minDepth(root.left); int right_length = minDepth(root.right); if (left_length == 0 || right_length == 0){ return left_length + right_length + 1; } return Math.min(left_length,right_length)+1; }