算法(二叉树)——路径总和

文章目录

    • 1.题目描述
    • 2.解题思路
    • 3.代码实现


1.题目描述

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
    叶子节点是指没有子节点的节点。
算法(二叉树)——路径总和_第1张图片

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum

2.解题思路

    这一题我们需要在遇到叶子结点,而路径之和不为目标值之后进行回溯。所以这一题需要用到递归加回溯。
    既然提到了递归,就需要确定递归的三个条件:

  • 递归函数的参数和返回类型:参数应当是每次遍历的结点和当前的计数值count,返回值必须有,为bool类型。
  • 确定终止条件:如果遍历到叶子结点,计数值count为0(这里用目标值减去每个结点的val)的话,则返回true,如果遍历到叶子结点计数值count不为0则返回false。
  • 确定单层遍历的逻辑:递归函数有返回值,如果返回值为true的话,就立刻返回true。

3.代码实现

/**
 * 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 hasPathSum(TreeNode* root, int targetSum) {
        if(root == nullptr) return false;
        return travelsal(root, targetSum - root->val);
    }
private:
    bool travelsal(TreeNode* node, int count)
    {
        if(node->left == nullptr && node->right == nullptr && count == 0) return true;//到子节点且val和等于count
        if(node->left == nullptr && node->right == nullptr) return false;//到子节点但val和不等于count
        if(node->left)
        {
            count -= node->left->val;
            if(travelsal(node->left, count)) return true;
            count += node->left->val;
        }
        if(node->right)
        {
            count -= node->right->val;
            if(travelsal(node->right, count)) return true;
            count += node->right->val;
        }
        return false;
    }
};

你可能感兴趣的:(算法(二叉树),算法,深度优先,leetcode,c++,二叉树)