给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点,不能从子节点到父节点 4.总节点数目为n
要求:空间复杂度 O(n),时间复杂度 O(n) 进阶:空间复杂度 O(树的高度),时间复杂度 O(n)
输入:{5,4,8,1,11,#,9,#,#,2,7},22
返回值:true
深度优先遍历 + 回溯
- 深度优先遍历首先判断当前节点,如果为 nil 则表示递归至最深层开始回溯
- dfs 函数会将 sum 减去当前节点的值,当到了叶子节点且 sum 减到零时,说明目标路径存在
func hasPathSum(root *TreeNode, sum int) bool {
// 遍历到了叶子节点但是该路径不符合条件
if root == nil {
return false
}
// 目标值递减
sum -= root.Val
// 左右节点都为空说明到了叶子节点,和也减到了0,说明找到了符合条件的路径
if root.Left == nil && root.Right == nil && sum == 0 {
return true
}
// 对左右分支进行 dfs
return hasPathSum(root.Left, sum) || hasPathSum(root.Right, sum)
}