LeetCode112. 路径总和Golang版
1. 问题描述
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。


2. 思路
- 确定递归函数参数和返回值
func traversal(root *TreeNode, targetSum int) bool
- 确定终止条件
if root.Left == nil && root.Right == nil && targetSum == 0 {
return true
}
if root.Left == nil && root.Right == nil {
return false
}
- 确定单层递归逻辑
if root.Left != nil {
targetSum -= root.Val
if traversal(root.Left, targetSum) {
return true
}
targetSum += root.Val
}
if root.Right != nil {
targetSum -= root.Val
if traversal(root.Right, targetSum) {
return true
}
targetSum += root.Val
}
return false
3. 代码
3.1. 递归代码1
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil {
return false
}
if targetSum==root.Val && root.Left == nil && root.Right == nil {
return true
}
return hasPathSum(root.Left,targetSum - root.Val) || hasPathSum(root.Right,targetSum - root.Val)
}
3.2. 递归代码2
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil {
return false
}
return traversal(root, targetSum - root.Val)
}
func traversal(root *TreeNode, targetSum int) bool {
if root.Left == nil && root.Right == nil && targetSum == 0 {
return true
}
if root.Left == nil && root.Right == nil {
return false
}
if root.Left != nil {
targetSum -= root.Left.Val
if traversal(root.Left, targetSum) {
return true
}
// 回溯
targetSum += root.Left.Val
}
if root.Right != nil {
targetSum -= root.Right.Val
if traversal(root.Right, targetSum) {
return true
}
// 回溯
targetSum += root.Right.Val
}
return false
}
310

被折叠的 条评论
为什么被折叠?



