主要是有一点需要注意:
- 路径终点必须是叶子
要实现这一点有两个地点需要注意:
- sum 必须在叶子节点判断
- 根节点的左右子树必须要和其它子树进行区分。因为不进行区分的话有可能根节点就满足要求了,这时左/右子树其中一个为 nullptr,就会得到错误的结论
class Solution {
public:
bool hasPath = false;
int target = 0;
TreeNode* top = nullptr;
void NodeSum(TreeNode* head, int sum) {
// 到达叶子节点
if(!head && sum == target) {
hasPath = true;
return;
}
if(!head) return;
if(head == top && !(head->right)) NodeSum(head->left, sum + head->val);
else if(head == top && !(head->left))
NodeSum(head->right, sum + head->val);
else {
NodeSum(head->left, sum + head->val);
NodeSum(head->right, sum + head->val);
}
}
bool hasPathSum(TreeNode* root, int sum) {
if(!root) return false;
top = root;
target = sum;
NodeSum(root, 0);
return hasPath;
}
}; 
京公网安备 11010502036488号