leetcode-437

179 阅读1分钟

题目描述:具体描述见原题。简单来说就是在二叉树中自上而下寻找路径值和等于给定值的路径数量。

集体思路:分为三种情况,第一种是路径从根节点开始,第二种是路径从根节点左子节点开始,第三种是路径从根节点右子节点开始。当访问节点A时,如果当前节点值等于给定值,那么路径数量等于1+左子树查找(给定值-节点值)路径数量+右子树查找(给定值-节点值)路径数量,否则路径数量等于左子树查找(给定值-节点值)路径数量+右子树查找(给定值-节点值)路径数。注意题目要求中有负数出现,所以每条路径一定要遍历到底,不能中途返回。具体过程见代码。

具体代码:

func pathSumII(root *TreeNode, targetSum int) int {
   if root == nil {
      return 0
   }
   ps := find(root, targetSum) // 路径从根节点开始
   ps += pathSumII(root.Left, targetSum) // 路径从左子树开始
   ps += pathSumII(root.Right, targetSum) // 路径从右子树开始
   return ps 
}

func find(root *TreeNode, target int) int {
   if root == nil { // 终止条件
      return 0
   }
   temp := 0
   if root.Val == target { // 当前节点值等于目标值
      temp++
   }
   temp += find(root.Left, target-root.Val) // 左子树寻找target-root.val
   temp += find(root.Right, target-root.Val) // 右子树寻找target-root.val
   return temp
}

补充说明:忘记了寻找路径和I是啥了...