给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
从根节点由上到下访问,采用先序遍历的顺序,由一条路径开始每次减掉当前节点的值,当访问到叶子节点时候目标值变为0表示有一条从根节点到叶子节点的路径返回true,否则返回false。下面用递归三部曲归纳递归流程:
1.确定函数的参数和函数的返回值每次需要传入当前节点和目标值2.递归终止条件递归调用到叶子节点时候且目标节点值为0返回true否则返回false。3.递归单层逻辑。从二叉树的左子树和右子树分别进行考察。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool traversal(TreeNode* root,int count)
{
if(!root->left&&!root->right&&count==0) return true;
if(!root->left&&!root->right) return false;
if(root->left)
{
count-=root->left->val;
if(traversal(root->left,count)) return true;
count+=root->left->val;
}
if(root->right)
{
count-=root->right->val;
if(traversal(root->right,count)) return true;
count+=root->right->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==NULL) return false;
return traversal(root,targetSum-root->val);
}
};
/**
-
Definition for a binary tree node.
-
struct TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode() : val(0), left(nullptr), right(nullptr) {}
-
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
-
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
-
};
/
class Solution {
public:
bool traversal(TreeNode root,int count)
{
if(!root->left&&!root->right&&count==0) return true;
if(!root->left&&!root->right) return false;
if(root->left)
{
count-=root->left->val;
if(traversal(root->left,count)) return true;count+=root->left->val; } if(root->right) { count-=root->right->val; if(traversal(root->right,count)) return true; count+=root->right->val; } return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==NULL) return false;
return traversal(root,targetSum-root->val);
}
};