1. 題目描述
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
2. 樣例
3. 分析
這道題屬於典型使用DFS的思路。題目要求很明確,給了一棵樹以及給了一個整數sum,讓我們判斷在這棵樹中能否找到一條從根節點到葉子節點的路徑出來,使該路徑中所有節點的數值之和等於sum。
思路呢:利用DFS的策略,從根節點開始向下進行遍歷(其實就是樹的先序遍歷)。
在遍歷過程中,如果遍歷到葉子節點,此時的葉子節點對應的數值與此時的sum相同,則爲true,否則該條路徑爲false。
如果沒有遍歷到葉子節點,就繼續遞歸,其中sum的值需要減去當前節點的val值,代表該節點已經被訪問過了。
4. 源碼
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == NULL) {
return false;
}
if (root->val == sum && root->left == NULL && root->right == NULL) {
return true;
}
else {
if (hasPathSum(root->left, sum-root->val) == true || hasPathSum(root->right, sum-root->val) == true) {
return true;
}
return false;
}
}
};
5. 心得
我覺得使用DFS、或者之前的分治法的時候,遞歸是一種最常見的手段,然而遞歸的重點在於如何設計減小問題的規模,即如何設計遞歸裏面的具體結構,以及何時跳出遞歸的條件。
第一次我提交代碼的時候出現了WA,原因是題目裏面沒有說清楚是必須根節點到葉子節點的路徑,結果出現了偏差。
以下是錯誤的代碼:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == NULL) {
return false;
}
if (root->val == sum) {
return true;
}
else if (root->val > sum){
return false;
}
else {
if (hasPathSum(root->left, sum-root->val) == true || hasPathSum(root->right, sum-root->val) == true) {
return true;
}
return false;
}
}
};