[LeetCode 112. 路径总和] |刷题打卡

143 阅读1分钟

一、题目描述:

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

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

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true

引自:leetcode-cn.com/problems/pa…

题目链接:112. 路径总和

二、思路分析:

  1. 深度遍历二叉树,并且依次用 targetNum 减去遍历时的根结点的值;
  2. 需要特别考虑一个二叉树只有根结点的情况,直接检查是否根结点的值和 targetNum 的值一样;
  3. 其他普通情况就使用递归的方式分别查看根结点的左右子树中,是否存在和为 targetNum 的路径;

三、AC 代码:

 class Solution {
    func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool {
        dfsSum(root, targetSum);
    }

    //! 深度遍历校验和
    func dfsSum(_ root: TreeNode?, _ targetSum: Int) -> Bool {
         if (root == nil) {
            return false;
        }
        let rootValue : Int = root?.val ?? 0;
        var leftNode : TreeNode? = root?.left;
        var rightNode : TreeNode? = root?.right;

        // 只有根结点的情况
        if (leftNode == nil && rightNode == nil) {
            return rootValue == targetSum;
        }

        // 递归查看左右子树中是否存在和为 targetSum 的路径
        // 使用 targetSum - 根结点的值 会省一个走过的路径的和的变量
        let leftFlag : Bool = hasPathSum(leftNode, targetSum - rootValue);
        let rightFlag : Bool = hasPathSum(rightNode, targetSum - rootValue);
        if (leftFlag || rightFlag) {
            return true;
        }
        return false;
    }
}

四、参考学习网址

二叉树

本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情