问题描述:具体描述见原题,简单来说就是按照一定规则寻找最大值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两道题是啥了....