/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func rob(root *TreeNode) int {
var max func(x, y int) int // 取最大值
var dfs func(*TreeNode) // 递归函数
var rob func(root *TreeNode) int // 最大收益
var f = make(map[*TreeNode]int) // 选择o节点的最大值
var g = make(map[*TreeNode]int) // 不选择o节点的最大值
max = func(x, y int) int {
if x > y {
return x
}
return y
}
// 后序遍历
dfs = func(node *TreeNode) {
// base case
if node == nil {
return
}
dfs(node.Left)
dfs(node.Right)
// 做选择
// 选择o节点,那么就不能选择子节点 f选择,g不选择
f[node] = node.Val + g[node.Left] + g[node.Right]
// 不选择o节点,那么子节点可选择或不选择,最两种选择的最大值
g[node] = max(f[node.Left], g[node.Left]) + max(f[node.Right], g[node.Right])
}
rob = func(root *TreeNode) int {
dfs(root)
return max(f[root], g[root])
}
return rob(root)
}
评论