(Leetcode 刷題) 路徑總和Ⅲ

題目描述

給定一個(gè)二叉樹,它的每個(gè)結(jié)點(diǎn)都存放著一個(gè)整數(shù)值。
找出路徑和等于給定數(shù)值的路徑總數(shù)。
路徑不需要從根節(jié)點(diǎn)開始,也不需要在葉子節(jié)點(diǎn)結(jié)束,但是路徑方向必須是向下的(只能從父節(jié)點(diǎn)到子節(jié)點(diǎn))。
二叉樹不超過1000個(gè)節(jié)點(diǎn),且節(jié)點(diǎn)數(shù)值范圍是 [-1000000,1000000] 的整數(shù)。
437. 路徑之和Ⅲ

解法1 遞歸

用了兩個(gè)遞歸,第一個(gè)遞歸是算給定節(jié)點(diǎn)為根的樹中有多少滿足條件的路徑;第二個(gè)遞歸是二叉樹的每個(gè)節(jié)點(diǎn)都執(zhí)行一次第一個(gè)遞歸。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //用于保存最后的路徑總數(shù)
    int res = 0;

    public int pathSum(TreeNode root, int sum) {
        if (root == null) {
            return 0;
        }
        //helper函數(shù)計(jì)算輸入節(jié)點(diǎn)有多少條符合條件路徑
        helper(root, sum);
        //左孩子
        pathSum(root.left, sum);
        //右孩子
        pathSum(root.right, sum);
        return res;
    }

    public void helper(TreeNode root, int sum) {
        if (root == null) {
            return;
        }
        //每遍歷到一個(gè)節(jié)點(diǎn),sum減去這個(gè)節(jié)點(diǎn)值
        sum -= root.val;
        if (sum == 0) {
            res++;
            /*
             *這里一開始我寫了條return,但是沒過,發(fā)現(xiàn)在非葉
             *子節(jié)點(diǎn)時(shí)sum到0就return而不往下遍歷的話,會(huì)遺漏后續(xù)節(jié)點(diǎn)中相加為0的 
             *情況。例如 [1,-2,-3,1,3,-2,null,-1] 的二叉樹,[1, -2]是,[1, -2, 1, -1]也是,
             *如果這里有return,后面這條就遞歸不出來。
            */
        }
        helper(root.left, sum);
        helper(root.right, sum);
    }
}

解法2 遞歸加回溯

提交了第一種解法的代碼后,去leetcode后臺(tái)看了下數(shù)據(jù),發(fā)現(xiàn)有人提交了3ms的結(jié)果(解法1 28ms),里面有更為驚艷的想法。
這篇講得很清楚

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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