二叉树路径和

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

题目描述

给定一个二叉树的root节点,再给定一个targetsum,判断是否存在一个根节点到叶子节点的路径,并且这条路径上所有节点的和等于给出的targetsum,如果有,返回true,如果没有,返回false,下图为二叉树示例:

pathsum1.jpg

思路描述

  1. 如果计算路径和,可以对各个节点分别计算左子树路径和以及右子树路径之和,对各个节点的左右子树操作为相同的重复操作,因此可以使用递归
  2. 由于遍历节点时分为三种情况: 节点为空
    • 节点为空时,不存在路径和,所以返回false
    • 节点不存在左子树和右子树,此时节点为叶子节点
      • 当节点没有左右孩子,也就是只有当前节点时,返回当前节点路径值是否等于目标和
    • 节点存在左子树或者右子树
      • 依次对左孩子和右孩子进行判断,即到当前节点路径和是否等于目标和,递归函数实参代入分别是左孩子与目标和,右孩子与目标和。
      • 为了操作方便,我们遍历到一个孩子节点,就将上一节点的目标和-当前节点路径值=此孩子节点的目标和,即此节点的孩子节点可能取得的路径值,
      • 此时只需要判断孩子节点是否和(上一节点的目标和-当前节点路径值)相等,如果相等,那么这样的路径就存在
      • 由于根节点的左孩子和右孩子只需要一个成立即可,所以两者取 “或” 操作

代码实现

 class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        //当给出二叉树根节点是空
        if(root == NULL)
        {
            return false;
        }
        //当遍历到叶子节点,返回叶子节点的值是否等于给定的目标和
        if(root->left==NULL && root->right==NULL)
        {
            return targetSum == root->val;
        }
        //当没有遍历到叶子节点时
        return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);
        //上一语句含义:先判断根节点的左孩子,targetSum-root->val表示目标和减去当前节点的值,也就是左孩子可能产生的目标和,当遍历到叶子节点,就是判断给出的目标和依次减去遍历到的节点值所产生的剩余和叶子节点值比较,如果相等,就说给定的目标和与某条路径和相等
    }
};