每日一題,防止癡呆 = =
一、題目大意
給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明: 葉子節點是指沒有子節點的節點。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/path-sum
二、題目思路以及AC代碼
思路
一開始把這道題看成了樹中是否存在一條由根節點出發的路徑,使得路徑和爲sum,沒有注意必須是葉子節點,但是其實方法是一樣的,都是bfs或者dfs,在這裏因爲遞歸實現起來比較容易,所以我選擇了dfs進行實現。
AC代碼
/**
* 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 check(TreeNode* root, int sum, int target) {
// 如果節點值沒有負的,則可以再剪枝
// 不過這裏我試了一下,節點值是有負的的 = =
sum += root->val;
if (sum == target && !root->left && !root->right) return true;
bool left = root->left ? check(root->left, sum, target) : false;
bool right = root->right ? check(root->right, sum, target) : false;
return left || right;
}
bool hasPathSum(TreeNode* root, int sum) {
if (!root) return false;
return check(root, 0, sum);
}
};
如果有問題,歡迎大家指正!!!