leetcode-337

120 阅读1分钟

问题描述:具体描述见原题,简单来说就是按照一定规则寻找最大值K。

解题思路:依旧是递归。对于任意一个节点,可以选择取值和不取值两种操作。1.当选择该点值时,可获得最大值K为该点节点值+不选取该点左节点值时可获得的最大值+不选取该点右节点值时可获取的最大值。2.不选择该节点值时,可获得最大K值为max(选取该点左子节点时获取的最大值, 不选取该点左子节点时获取的最大值)+max(选取该点右子节点时获取的最大值, 不选取该点右子节点时获取的最大值)。最后比较两种操作获取的值,返回较大者即可。

具体代码:

func rob(root *TreeNode) int {
   ur, wr := steal(root)
   return max(ur, wr)
}

func steal(root *TreeNode) (a, b int) {
   if root == nil { // 递归终止条件
      return 0, 0
   }
   lur, lwr := steal(root.Left) // 递归操作左子树,lur为选择左子节点获取的最大值,lwr为不选取左子节点时获取的最大值
   rur, rwr := steal(root.Right)  // 递归操作右子树,rur同lur,rwr同lwr
   ur := root.Val + lwr + rwr // 选择该节点值时可获得的最大值
   wr := max(lur, lwr) + max(rur, rwr) // 不选择该节点时可获得的最大值
   return ur, wr
}

func max(x, y int) int { // 比较两者较大值
   if x > y {
      return x
   }
   return y
}

补充说明:突然忘记了打家劫舍I和打家劫舍II两道题是啥了....