樹 --- leedcode 437 統計路徑和等於一個數的路徑數量 (Easy)

題目

給定一個二叉樹,它的每個結點都存放着一個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

返回 3。和等於 8 的路徑有:

1.  5 -> 3
2.  5 -> 2 -> 1
3.  -3 -> 11

解析

思路: 雙重遞歸

  • 既然路徑不一定以 root 開頭,也不一定以 leaf 結尾,但是必須連續。那麼每個節點都可以作爲根節點去dfs一次,只要存在滿足條件的路徑,就將結果加1.

js代碼:

var pathSum = function(root, sum) {
    if(root == null) return 0;
    // 每一個節點都作爲根節點遍歷一次
    let res = dfs(root, sum)+ pathSum(root.left, sum) + pathSum(root.right, sum); 
    return res;
    
    // 每一個節點都要將其左右子樹遍歷完
    function dfs (root, num) {
        if(root == null) return 0;
        let ret = 0;
        if(root.val == num){
            ret ++;
        }  
        ret +=  dfs(root.left, num - root.val)+ dfs(root.right, num - root.val);
        return ret;
    }
};

java代碼:

class Solution {
   public int pathSum(TreeNode root, int sum) {
    if (root == null) return 0;
    int ret = pathSumStartWithRoot(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum);
    return ret;
}

private int pathSumStartWithRoot(TreeNode root, int sum) {
    if (root == null) return 0;
    int ret = 0;
    if (root.val == sum) ret++;
    ret += pathSumStartWithRoot(root.left, sum - root.val) + pathSumStartWithRoot(root.right, sum - root.val);
    return ret;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章