主要是有一点需要注意:
- 路径终点必须是叶子
要实现这一点有两个地点需要注意:
- 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; } };