112. Path Sum

仅供自己学习

 

思路:

广搜,深搜,回溯都能解决,因为是简单题可以用来再强化三种方法的使用。

广搜:

这里用两个队列一个用来存放节点,另一个用来存放下一层的节点到源节点的距离和。每次对距离和的处理都是用当前距离加上下一个节点的距离,其余处理都是一样的。节点队列非空的时候就循环,取出队列第一个元素,然后判断是否为叶子节点,如果是就判断是否等于targetsum,等于就返回true,不等就continue因为此时判断是叶子节点。如果不是叶子节点,那么就判断是否有左右节点,有的话就加入左节点以及更新该左节点到原点的距离和,对右节点同样的操作。如果循环中没能返回true,那么则不存在等于targetsum的路径和,返回false

代码:

 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) return false;
16         queue<TreeNode*> node;
17         queue<int> nval;
18         node.push(root);
19         nval.push(root->val);
20         while(!node.empty()){
21             TreeNode* temp=node.front(); node.pop();
22             int tval=nval.front(); nval.pop();
23             if(!temp->left&&!temp->right){
24                 if(tval==targetSum)
25                     return true;
26                 continue;
27             }
28             if(temp->left){
29                 node.push(temp->left);
30                 nval.push(temp->left->val+tval);
31             }
32             if(temp->right){
33                 node.push(temp->right);
34                 nval.push(temp->right->val+tval);
35             }
36 
37         }
38         return false;
39 
40     }
41 };

 

这里DFS和回溯差不多

我们更改每次递归传入的targetsum,为此传入的都为targetsum-root->val,这样如果存在这条路径,那么最后一次递归如果是叶子节点targetsum==root->val,此时就返回true。因为要对源节点的左右子树都递归,所以我们只需要存在即可,所以用“或”将两棵树的结果结合起来。

 

代码:

 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) return false;
16         if(!root->left&&!root->right){
17             if(targetSum==root->val)
18                 return true;
19         }
20         return hasPathSum(root->left,targetSum-root->val)||
21                 hasPathSum(root->right,targetSum-root->val);
22 
23     }
24 };

 

posted @ 2021-03-10 17:29  Mrsdwang  阅读(51)  评论(0)    收藏  举报