后序遍历+动态规划
看到树形结构优先考虑root和左右子树的关系。
使用后序遍历是因为需要得到两个子节点的状态才能计算当前节点。
时间复杂度:O(N)
空间复杂度:O(N)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| func rob(root *TreeNode) int {
var dfs func(*TreeNode) []int dfs = func(root *TreeNode) []int { if root == nil { return []int{0, 0} }
left := dfs(root.Left) right := dfs(root.Right)
selected := root.Val + left[0] + right[0] noSelected := max(left[0], left[1]) + max(right[0], right[1])
return []int{noSelected, selected} }
temp := dfs(root)
return max(temp[0], temp[1]) }
func max(a, b int) int { if a > b { return a } return b }
|