二叉樹路徑總和

///路徑總和I

路徑總和leetcode鏈接

/*

1.確定遞歸函數(shù)的參數(shù)和返回類型

參數(shù):需要二叉樹的根節(jié)點(diǎn),還需要一個(gè)計(jì)數(shù)器,這個(gè)計(jì)數(shù)器用來計(jì)算二叉樹的一條邊之和是否正好是目標(biāo)和,計(jì)數(shù)器為int型。

*/

private boolean traversal(TreeNode root, int count){

????if (root ==null){

????????return false;

? ? }

? ? /*

? ? 2.確定終止條件

????首先計(jì)數(shù)器如何統(tǒng)計(jì)這一條路徑的和呢?

????不要去累加然后判斷是否等于目標(biāo)和,那么代碼比較麻煩,可以用遞減,讓計(jì)數(shù)器count初始為目標(biāo)和,然后每次減去遍歷路徑節(jié)點(diǎn)上的數(shù)值。

????如果最后count == 0,同時(shí)到了葉子節(jié)點(diǎn)的話,說明找到了目標(biāo)和。

????如果遍歷到了葉子節(jié)點(diǎn),count不為0,就是沒找到。

????*/

? ? if (root.left ==null && root.right ==null && count ==0){

????????return true;

? ? }

????if (root.left ==null && root.right ==null ){

????????return false;

? ? }

? ? /*

? ? 3.確定單層遞歸的邏輯

????因?yàn)榻K止條件是判斷葉子節(jié)點(diǎn),所以遞歸的過程中就不要讓空節(jié)點(diǎn)進(jìn)入遞歸了。

? ? 如果未找到滿足條件的,記得回溯

? ? */

????if (root.left){

????????count -= root.left.val;

? ? ? ? traversal(root.left, count); //遞歸

? ? ? ? count += root.left.val; //不滿足條件,回溯

? ? }

????if (root.right){

????????count -= root.right.val;? ? //

? ? ? ? traversal(root.right, count); //遞歸

? ? ? ? count += root.right.val;? ? //不滿足條件,回溯

? ? }

????return false

}



/// 路徑總和II

路徑總和II LeetCode鏈接

public List> pathsumII(TreeNode root, int count){

????List> res =new ArrayList<>();

? ? if (root ==null) {

????????return res;

? ? }

????List path =new ArrayList<>();

? ? traversalII(root, count, res, path);

? ? return res;

}

private void traversalII(TreeNode root, int count, List> result, List path){

????path.add(root.val);

? ? if (root.left ==null && root.right ==null && count ==0){

????????result.add(path);

????????return;

? ? }

????if (root.left){

????????count -= root.left.val; //count減去當(dāng)前節(jié)點(diǎn)值

? ? ? ? path.add(root.left.val);? ? //添加當(dāng)前值

? ? ? ? traversal(root.left, count);? ? //遞歸

? ? ? ? count += root.left.val; //回溯

? ? ? ? path.remove(path.size()-1);

? ? }

????if (root.right){

????????count -= root.right.val;? ? //count進(jìn)去當(dāng)前節(jié)點(diǎn)值

? ? ? ? path.add(root.right.val);? //添加當(dāng)前值

? ? ? ? traversalII(root.right, count); //遞歸

? ? ? ? count += root.right.val;? ? //回溯

? ? ? ? path.remove(path.size()-1);

? ? }

}

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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