每天一道LeetCode-23(路径总和)

26 阅读2分钟

题目描述

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

分析

拿到这个题目,我首先想的是将所有的节点都进行遍历相加, 将结果存放在数组中,判断目标值是否在数组中存在,但是这样需要做大量的重复操作,于是再每次获取一个新的sum值时,将sum与target进行比较,如果相等,则返回true,否则继续进行递归子树。

  • 首先明确递归函数的返回值和参数,由于是返回是否存在路径,于是返回值设置为bool类型,参数需要传入的根节点p,目标值t以及累加的值sum。
  • 接下来判断终止条件,如果传入的是根节点为空,则直接返回false。
  • 如果目前的累加sum与t相等,并且当前节点是叶子节点,则返回true。
  • 最后进入单层循环逻辑,我们首先要对sum的值进行累加,然后判断当前的sum与t的值是否相等,相等则直接向上返回true,如果不相等,则对当前节点的子树进行递归,如果子树的路径sum等于t,则直接返回true。

代码实现


bool pathSum(struct TreeNode* p, int t, int sum){
    if(p == NULL) return false;
    sum += p->val;
    if(sum == t && !p->left && !p->right) return true;
    if(!p->left && pathSum(p->left,t,sum)) return true;
    if(!p->right && pathSum(p->right,t,sum)) return true;
    return false;
}

bool hasPathSum(struct TreeNode* root, int targetSum){
    int sum = 0;
    return getPathSum(root,targetSum,sum);
}