Leetcode112
链接:力扣 。
题目:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
思路:
采用递归的思路。这道题我们要遍历从根节点到叶子节点的的路径看看总和是不是目标和。因此边界条件是对叶子结点的处理。
依然用前序遍历的思路来考虑问题,先考虑当前结点,再考虑左孩子和右孩子。
1.函数的返回值和参数
参数很好确定,我们需要传入当前树的根结点root、当前路径和sum、以及目标targetSum。对于返回值,我们最好使用bool型,如果返回true表示已经找到和为targetSum的路径,逐层将这个true值传给上层,否则返回false。
2.边界条件
当访问到叶结点时,表示我们已经走完了一条路径,需要开始判断该路径和了。因此边界条件是对于叶子结点的处理,这是和前序遍历时不一样的地方(在递归的遍历中,边界条件为空结点,当结点为空时直接返回)。因此,我们在本题中绝对不能让空结点进入下一层递归,这是需要注意的。
将路径和sum与当前结点的val相加,如果其路径和为targetSum,则返回true,否则返回false。
3.单层递归逻辑
如果当前结点不是叶结点,说明还没有走完该条路径。根据前序的逻辑,我们要递归进入左孩子和有孩子。将路径和sum与当前结点的val相加。如果左孩子不为空,则递归进入左孩子,如果左孩子的返回值为true,则直接return true。然后递归进入右孩子,如果右孩子的返回值为true,则直接return true。
这样的情况下,只要左右孩子中有一个子树找到了需要路径我们就可以直接将true传给最上层。如果左右孩子都返回false,说明还没有找到,则当前递归层也返回false。
参考代码:
/**
* 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 sum, int targetSum) {
sum += root->val;
if (root->left == nullptr && root->right == nullptr && sum == targetSum) {
return true;
}
else if (root->left == nullptr && root->right == nullptr && sum != targetSum) {
return false;
}
if (root->left) {
if(traversal(root->left, sum, targetSum)) {
return true;
}
}
if (root->right) {
if(traversal(root->right, sum, targetSum)) {
return true;
}
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
int sum = 0;
if (root == nullptr) {
return false;
}
else {
return traversal(root, sum, targetSum);
}
}
};