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 };

浙公网安备 33010602011771号