1. 程式人生 > 實用技巧 >路徑總和、二叉樹的最小深度(力扣第112、111題)

路徑總和、二叉樹的最小深度(力扣第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;
    }