一、题目描述:
给你二叉树的根节点 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. 路径总和
二、思路分析:
- 深度遍历二叉树,并且依次用 targetNum 减去遍历时的根结点的值;
- 需要特别考虑一个二叉树只有根结点的情况,直接检查是否根结点的值和 targetNum 的值一样;
- 其他普通情况就使用递归的方式分别查看根结点的左右子树中,是否存在和为 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 月闯关活动」, 点击查看 活动详情