7月7日
leetcode no.112 路徑總和
相當於遍歷原樹的同時新建一顆形狀相同的「和樹」。若和樹葉子結點的val等於目標sum,則返回成功,否則返回失敗。
遞迴函式的作用是,輸入當前原樹中的某個節點和「和樹」中對應的節點,返回該節點下是否存在滿足要求的路徑(樹根到葉子結點)。
bool check(treenode * originalnode,treenode* sumnode)遞推過程
回溯過程
回溯返回值
/*第一次刷題,本覺得題目很簡單,但提交了5次才通過,前後更是花了乙個半小時。* * 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;
**/
有以下邏輯考慮不細緻的地方,以後盡量避免:
我採用的應該算是深搜的方法,當一條路徑被否決回退時,要保證走另一條分支時的引數不受已走過的被否決分支影響。
當前節點是葉子節點的條件應當與當前節點存在子節點的條件互斥。最後處理的情況前少了判斷條件。
沒有考慮題目給的樹根節點是null的情況。
同樣是遞迴,我的實現累贅。
class不需要單獨一顆「和樹」。「和樹」的作用是記錄不同路徑的路徑總和,利用遞迴的傳參可以記錄到當前節點的路徑總和,甚至可以用減法,每次遞迴呼叫時,把剩餘路徑和減去當前節點val的差作為引數(剩餘路徑和)。solution
if (root->left == nullptr && root->right ==nullptr)
return haspathsum(root->left, sum - root->val) ||haspathsum(root->right, sum - root->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...