路径总和

72 阅读1分钟

思路一:

暴力方法,穷举所有路径,判断和是否相等,如果遇到相等的,返回 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
}