题目1:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5 输出:false 解释:树中存在两条根节点到叶子节点的路径: (1 --> 2): 和为 3 (1 --> 3): 和为 4 不存在 sum = 5 的根节点到叶子节点的路径。
下面来说一说我的思路:
依旧老规矩想到回溯,使用在递归函数的周围应该有一下几点内容
1:加上或者减去一个值val
2:递归函数,向左或者向右
3:回溯,减去或者加上一个值val
然后就是判断退出条件了:
如果cur指向的左右都为nullptr 并且 值为0那么就代表了找到一条正确的路,返回true
如果cur指向左右都为nullptr那么就返回
所以可得代码:
class Solution {
public:bool panduan = false;void order(TreeNode* cur,int targetSum){if(cur->left == nullptr && cur->right == nullptr && targetSum == 0){panduan = true;return;}if(cur->left == nullptr && cur->right == nullptr){return;}if(cur->left){targetSum -= cur -> left -> val;order(cur->left,targetSum);targetSum += cur->left->val;}if(cur->right){targetSum -= cur -> right -> val;order(cur->right,targetSum);targetSum += cur->right->val;}}bool hasPathSum(TreeNode* root, int targetSum) {if(root == nullptr){return false;}order(root,targetSum-root->val);return panduan;}
};
这里有一个很关键的点:因为我们要找到是否存在一条线路可以使节点值和为targetSum
但是我们在递归函数中用的是当前节点的下一个节点,所以传入的内容为targetSum-root->val
下面来看第二道题目:
题目大差不差,我直接说不同的地方,这个题目需要返回一个二维数组,每一行的值代表一条路,和为targetSum
思路:
首先接收值:一个根节点,一个二维数组的引用,一个 targetSum
结束条件和上面一个一样,但是结束条件里面的内容是吧一个一维数组加到二维数组里面
然后递归函数:
首先把val放到一维数组中,并且让targetSum减去val
然后递归往左或者往右
把val加回去
pop掉
看代码:
class Solution {
public:vector<int> add;vector<vector<int>> result;void order(TreeNode* cur,vector<vector<int>>& result,int targetSum){if(cur->left == nullptr && cur->right == nullptr && targetSum == 0){result.push_back(add);return;}if(cur->left == nullptr && cur->right == nullptr)return;if(cur->left){add.push_back(cur->left->val);targetSum -= cur->left->val;order(cur->left,result,targetSum);targetSum += cur->left->val;add.pop_back();}if(cur->right){add.push_back(cur->right->val);targetSum -= cur->right->val;order(cur->right,result,targetSum);targetSum += cur->right->val;add.pop_back();}return;}vector<vector<int>> pathSum(TreeNode* root, int targetSum) {if(root==nullptr)return result;add.push_back(root->val);order(root,result,targetSum-root->val);return result;}
};