2022年7月3日leetcode每日一题打卡——112.路径总和

一、题目描述与要求

112. 路径总和 - 力扣(LeetCode)

题目描述

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

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

示例

示例1:

2022年7月3日leetcode每日一题打卡——112.路径总和_第1张图片

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

 示例2:

2022年7月3日leetcode每日一题打卡——112.路径总和_第2张图片

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

 示例3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示

  • 树中节点的数目在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

二、解题思路

总的思路:

要对题目给出的二叉树进行遍历并且找到其中是否有结点值相加能够等于目标值的线路。因此首先我们需要写出访问每个结点并且将其值相加后与目标值比较,如若相等则返回true,如果不想等则继续访问。在遍历的过程中采取的是深度优先搜索方式。首先还是一样,在处理二叉树的问题的时候首先要判断其是否为空树或者是否只有一个根结点。如果二叉树是空树的话则直接返回false;如果只有一个根节点并且值等于目标值的话则返回true,值不相等则返回false。其中要注意的是在访问每一个结点并且对其进行判断是否为空之后只要不为空就将该结点的值与totalSum相加,从而让其与targetSum相比较,如果相等则返回true。其中root->left==NULL&&root->right==NULL&&totalSum==targetSum这一语句就是针对访问到叶子结点之后这条路径的和是否与目标值相同,如果相同就返回true,如果不同则会返回false并且返回到上一个访问的结点,此时totalsum就不会包括叶子结点,而是去访问叶子结点的兄弟或者双亲的兄弟,在左子树没找到就去右子树。以此来通过递归的方式以深度优先搜索的方式,在找到叶子结点并且和不相等时则返回上一个结点,都是采取先左后右的规则。

具体步骤:

1、判断二叉树是否为空
2、将结点的值与totalSum相加累积
3、判断该节点是否为叶子结点,是的话目前totalSum的值是否与目标值相同
4、对左子树进行遍历;对右子树进行遍历。(只有在整个左子树都找不到路径的情况下才回去访问右子树)
5、层层递归最后返回结果

三、具体代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

bool DFS(struct TreeNode* root,int totalSum,int targetSum)
{
    if(root==NULL)//如果二叉树为空树返回false
      return false;
    totalSum+=root->val;//否则将根结点的值赋给totalSum(计算总和)
    if(root->left==NULL&&root->right==NULL&&totalSum==targetSum)//如果只有根结点并且根结点的值等于目标值则返回true
     return true;
    if(root->left!=NULL)//如果左子树不为空则对其进行访问并相加,存在和等于targetSum则返回true
    {
        if(DFS(root->left,totalSum,targetSum))
         return true;
    }
    if(root->right!=NULL)//如果右子树不为空则对其进行访问并将值相加,存在和等于targetSum则返回true
    {
        if(DFS(root->right,totalSum,targetSum))
         return true;
    }
    return false;//否则返回false
}

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

你可能感兴趣的:(leetcode刷题,leetcode,算法,职场和发展,c语言,数据结构)