leetcode 刷题系列
原题链接: 戳.
class Solution:
def rob(self, root: TreeNode) -> int:
# 最大问题分解为
# 在树中,最常见的就是不断划分子树
# 所以找每一个节点的字数最大
# 维护两个全局字典
f={}
g={}
f[None]=0
g[None]=0
# f means choose this node,g means dont choose
def dps(t):
if t==None:
return
dps(t.left)
dps(t.right)
f[t]=g[t.left]+g[t.right]+t.val
g[t]=max(f[t.left],g[t.left])+max(f[t.right],g[t.right])
dps(root)
return max(f[root],g[root])
后来发现不需要字典存:
class Solution:
def rob(self, root: TreeNode) -> int:
def _rob(root):
if not root: return 0, 0 # 偷,不偷
left = _rob(root.left)
right = _rob(root.right)
# 偷当前节点, 则左右子树都不能偷
v1 = root.val + left[1] + right[1]
# 不偷当前节点, 则取左右子树中最大的值
v2 = max(left) + max(right)
return v1, v2
return max(_rob(root))