思路一:
暴力方法,穷举所有路径,判断和是否相等,如果遇到相等的,返回 true
。。。
思路二:
两条路径有相同的父路径时,可以共用父路径的值
。。。
思路三:
递归
从根节点 a 到叶子节点,存在路径和为 sum 的路径,即存在根节点的左/右节点到叶子节点,存在路径和为 sum-a 的路径
注意,对于叶子节点,应该把判断叶子节点的逻辑放在外面,一个节点是 nil,说明不了他是叶子节点,也判断不了什么。
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil {
return false
}
if root.Left == nil && root.Right == nil {
if root.Val == targetSum {
return true
}
return false
}
hasLeft := hasPathSum(root.Left, targetSum-root.Val)
hasRight := hasPathSum(root.Right, targetSum-root.Val)
return hasLeft || hasRight
}
下面是错误解法
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil {
if targetSum == 0 {
return true
}
return false
}
//注意,正确处理空节点的情况
//if root == nil && targetSum == 0 {
// return true
//}
hasLeft := hasPathSum(root.Left, targetSum-root.Val)
hasRight := hasPathSum(root.Right, targetSum-root.Val)
//是叶子节点
if root.Left == nil && root.Right == nil {
//且有最小值
if hasLeft || hasRight {
return true
}
}
return false
}