【LeetCode】437. 路徑總和 III

437. 路徑總和 III

給定一個二叉樹,它的每個結(jié)點都存放著一個整數(shù)值。

找出路徑和等于給定數(shù)值的路徑總數(shù)。

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

二叉樹不超過1000個節(jié)點,且節(jié)點數(shù)值范圍是 [-1000000,1000000] 的整數(shù)。

示例:

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

雙重遞歸

/*
    思路:
        1.dfs是求從根節(jié)點出發(fā)到葉子節(jié)點滿足條件的路徑總數(shù)
        2.將給定的二叉樹看成三個部分:根節(jié)點、左子樹、右子樹
        3.三部分可以看成一個遞歸結(jié)構(gòu),先求從根節(jié)點出發(fā)滿足條件的路徑總數(shù)(dfs(root)),
          再遞歸求左子樹(pathSum(root.left)),遞歸求右子樹(pathSum(root.right))
    
    總結(jié):
        1.雙重遞歸,從全局找外層遞歸(如思路中的三個部分),再從部分中找內(nèi)層遞歸(如思路中的dfs)
*/

class Solution {
    private int count = 0; //存放結(jié)果
    public int pathSum(TreeNode root, int sum) {
        if(root == null) return 0;
        dfs(root, sum); //求從根節(jié)點出發(fā)滿足條件的路徑總數(shù)
        pathSum(root.left, sum); //遞歸求左子樹
        pathSum(root.right, sum); //遞歸求右子樹
        return count;
    }
    
    private void dfs(TreeNode root, int sum){
        if(root == null) return;
        sum -= root.val;
        if(sum == 0) count++; //滿足條件結(jié)果加一
        dfs(root.left, sum); //繼續(xù)往左子樹找
        dfs(root.right, sum); //繼續(xù)往右子樹找
    }
}

單重遞歸

/*
    思路:
        1.用雙重遞歸會重復(fù)計算很多次,其實我們只用單遞歸就可以解決,
          不妨將已經(jīng)走過的路徑值保存到book數(shù)組
        2.到i節(jié)點,就可以根據(jù)book倒序遍歷,找到從i節(jié)點到根節(jié)點滿足條件的路徑總數(shù)
        3.遞歸到最底層也就是葉子節(jié)點時,找出葉子節(jié)點到根節(jié)點的滿足條件的路徑總數(shù)之后,
          需要將book數(shù)組回溯到上一層的狀態(tài),以便從上一層繼續(xù)尋找
    
    總結(jié):
        1.將已經(jīng)求出的值保存,當(dāng)下次遞歸時可以直接使用,
          省去了重復(fù)計算浪費的時間,相當(dāng)于用空間換取時間
        2.遞歸返回到上層時,我們有時需要原來上層遞歸的狀態(tài),這時就需要用到回溯
*/

class Solution {
    
    private int count = 0; //存放結(jié)果
    public int pathSum(TreeNode root, int sum) {
        dfs(root, sum, new ArrayList<Integer>());
        return count;
    }
    
    private void dfs(TreeNode root, int sum, ArrayList<Integer> book){
        if(root == null) return;
        
        book.add(root.val); //加入當(dāng)前節(jié)點的值
        int cur_sum = 0;
        for(int i = book.size() - 1; i >= 0; i--){ //從當(dāng)前節(jié)點往根節(jié)點尋找滿足條件的路徑總數(shù)
            cur_sum += book.get(i);
            if(cur_sum == sum) count++;
        }
        
        dfs(root.left, sum, book); //遞歸求左子樹
        dfs(root.right, sum, book); //遞歸求右子樹
         
        book.remove(book.size() - 1); //回溯到上一次的狀態(tài),以便繼續(xù)尋找
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 437 Path Sum III 路徑總和 III Description:You are given a bin...
    air_melt閱讀 346評論 0 0
  • LeetCode 第 104 題:二叉樹的最大深度 提示:思路1:后序遍歷:看完左右子樹,才能計算自己; 思路2:...
    李威威閱讀 881評論 0 4
  • 437.路徑總和 III 給定一個二叉樹,它的每個結(jié)點都存放著一個整數(shù)值。 找出路徑和等于給定數(shù)值的路徑總數(shù)。 路...
    泡泡愛上巧克力_7122閱讀 829評論 0 0
  • 題目 難度:★★☆☆☆類型:二叉樹 給定一個二叉樹,它的每個結(jié)點都存放著一個整數(shù)值。 找出路徑和等于給定數(shù)值的路徑...
    玖月晴閱讀 938評論 0 0
  • 最近在看x檔案第一季,印象最深的,也讓我最怕的是一個太空人在宇宙外遇見了自己的鬼魂。 沒有生命存在的外太空,沉默寂...
    中毒成癮閱讀 246評論 0 0

友情鏈接更多精彩內(nèi)容