112 路徑總和(leetcode) 7月7日

2022-09-12 19:12:09 字數 2195 閱讀 4054

7月7日

leetcode no.112 路徑總和

相當於遍歷原樹的同時新建一顆形狀相同的「和樹」。若和樹葉子結點的val等於目標sum,則返回成功,否則返回失敗。

遞迴函式的作用是,輸入當前原樹中的某個節點和「和樹」中對應的節點,返回該節點下是否存在滿足要求的路徑(樹根到葉子結點)。

bool check(treenode * originalnode,treenode* sumnode)
遞推過程

回溯過程

回溯返回值

/*

* * definition for a binary tree node.

* struct treenode

* }; */

class

solution

bool check(treenode * originalnode,treenode * sumnode,int

sum)

if(originalnode->right!=null)

if(originalnode->left==null&&originalnode->right==null&&sumnode->val==sum)

return checker1 ||checker2;

}treenode * addleftson(int val,treenode *node)

treenode * addrightson(int val,treenode *node)

};//

/*需要一顆與原二叉樹相同的樹來儲存截止到當前節點的路徑和

1.若存在左子節點,和樹新增左子節點,和為當前和樹節點的sum+left.val;

1.1check(originaltreenode,sumtreenode);

2.若存在右子節點。。。同上

n.若不存在左子節點和右子節點,比較當前和樹的sum與目標和,若相同,返回1;否則返回no;

**/

第一次刷題,本覺得題目很簡單,但提交了5次才通過,前後更是花了乙個半小時。

有以下邏輯考慮不細緻的地方,以後盡量避免:

我採用的應該算是深搜的方法,當一條路徑被否決回退時,要保證走另一條分支時的引數不受已走過的被否決分支影響。

當前節點是葉子節點的條件應當與當前節點存在子節點的條件互斥。最後處理的情況前少了判斷條件。

沒有考慮題目給的樹根節點是null的情況。

同樣是遞迴,我的實現累贅。

class

solution

if (root->left == nullptr && root->right ==nullptr)

return haspathsum(root->left, sum - root->val) ||haspathsum(root->right, sum - root->val);

}};/***/

不需要單獨一顆「和樹」。「和樹」的作用是記錄不同路徑的路徑總和,利用遞迴的傳參可以記錄到當前節點的路徑總和,甚至可以用減法,每次遞迴呼叫時,把剩餘路徑和減去當前節點val的差作為引數(剩餘路徑和)。

遞迴函式中把出口條件的優先判斷處理,可能**更簡練。

廣度優先搜尋用佇列實現。個人理解這裡佇列先進先出的特性與廣搜一層一層掃瞄的特點吻合。

queue<>的使用(詳細原理待學習)

112 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和sum 22,5 48 1113 4 721返回true,因為存在目標和為 22 的根節點到葉子節點的路徑5 4 11 2。d...

112路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。進行分析,遞迴終止的條件是什麼?一次遞迴中要進行什麼操作?遞迴想要返回什麼資訊?終止條件 結點為空 遞迴中操作 sum減去當前結點值,當sum為0且當前為葉子...

112 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1返回 true,因為存在目標和為 22 的根節點到葉子節點的路徑 5 4...