LeetCode 112.路径总和
思路
递归
1、确定返回值与传入参数
参数:
- 1)二叉树的根节点
- 2)计数器,用于计算路径之和
返回值:
- 如果需要搜索整颗二叉树且不用处理递归返回值,递归函数就不要返回值。
- 如果需要搜索整颗二叉树且需要处理递归返回值,递归函数就需要返回值。
- 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题)
2、终止条件
让计数器初试为目标和,每次减去遍历路径节点上的数值,当计数器值为0,并且到了叶子结点(左右子节点都为NULL),则说明找到了目标和,若遍历到叶子节点时,计数器的值不为0,则说明没找到。
3、确定单层递归逻辑
递归遍历节点的左右子节点,遍历的过程中不能让空节点进入递归,因为终止条件是判断叶子结点。在递归遍历的过程中,需要对计数值进行回溯处理。
代码实现
class Solution {
public:
bool traversal(TreeNode *node, int sum) {
if(!node->left && !node->right && sum == 0) return true; // 遇到叶子节点,并且计数为0
if(!node->left && !node->right) return false; // 遇到叶子节点直接返回
if(node->left) {
if(traversal(node->left, sum - node->left->val)) return true; // 递归,处理节点,并回溯,撤销处理
}
if(node->right) {
if(traversal(node->right, sum - node->right->val)) return true;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == NULL) return false;
return traversal(root, targetSum - root->val) ;
}
};