337.打家劫舍 III

后序遍历+动态规划

看到树形结构优先考虑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 {
// root[1] = root.left[0] + root.right[0]
// root[0] = max(root.left[0], root.left[1]) + max(root.right[0], root.right[1])

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
}

337.打家劫舍 III
https://blog.jerrylee.me/2021/09/5b4cb558d58b.html
作者
Jerry Lee
发布于
2021年9月20日
许可协议