方法一:(DFS)将目标数依次减去遍历的节点树,最后判断既无左节点也无右节点的叶节点的值是否与减去之前父节点值所剩下的值是否相等。

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. bool hasPathSum(TreeNode* root, int targetSum) {
    15. if(root==NULL){
    16. return false;
    17. }
    18. if(root->left==NULL&&root->right==NULL){
    19. return (targetSum==root->val);
    20. }
    21. bool a1=hasPathSum(root->left,targetSum-root->val);
    22. bool a2=hasPathSum(root->right,targetSum-root->val);
    23. return a1||a2;
    24. }
    25. };

    方法二:使用广度优先遍历(BFS),将父节点的每个左右节点分别计算其路径总和,将其保存在队列之中与节点一同弹出—也不一定需要广度优先遍历,任何遍历都可以只需要保证对应路径一起弹出

    1. class Solution {
    2. public:
    3. bool hasPathSum(TreeNode* root, int targetSum) {
    4. if(root==NULL){
    5. return false;
    6. }
    7. queue<TreeNode*>s;
    8. queue<int>v;
    9. v.emplace(root->val);
    10. s.emplace(root);
    11. while(!s.empty()){
    12. TreeNode* head=s.front();
    13. s.pop();
    14. int temp=v.front();
    15. v.pop();
    16. if(head->left!=NULL){
    17. s.emplace(head->left);
    18. v.emplace(temp+head->left->val);
    19. }
    20. if(head->right!=NULL){
    21. s.emplace(head->right);
    22. v.emplace(temp+head->right->val);
    23. }
    24. if(head->right==NULL&&head->left==NULL&&temp==targetSum){
    25. return true;
    26. }
    27. }
    28. return false;
    29. }
    30. };