112 路径总和-简单
题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
分析:
算法1:递归
这种递归是自顶向下的方式,通过结合当前节点值,向下一层级传递新的目标值,以判断到达叶子节点时是否满足条件。
// date 2022/10/19
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil {
return false
}
targetSum -= root.Val
if root.Left == nil && root.Right == nil {
return targetSum == 0
}
return hasPathSum(root.Left, targetSum) || hasPathSum(root.Right, targetSum)
}
算法2:【推荐该算法】
迭代,类似层序遍历,当遍历到叶子节点时,判断值是否为零
// date 2023/10/18
/**
* 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
}
queue := make([]*TreeNode, 0, 16)
csum := make([]int, 0, 16)
queue = append(queue, root)
csum = append(csum, targetSum-root.Val)
n := len(queue)
for len(queue) != 0 {
n = len(queue)
for i := 0; i < n; i++ {
cur := queue[i]
// 找到叶子节点
if cur.Left == nil && cur.Right == nil && csum[i] == 0 {
return true
}
if cur.Left != nil {
queue = append(queue, cur.Left)
csum = append(csum, csum[i] - cur.Left.Val)
}
if cur.Right != nil {
queue = append(queue, cur.Right)
csum = append(csum, csum[i] - cur.Right.Val)
}
}
queue = queue[n:]
csum = csum[n:]
}
return false
}
最后更新于