这道题还是有点难度的一开始看了答案用的暴力解法但是会超出时间。暴力解法也是从全局构思,一开始太拘泥于具体的某个节点了。
class Solution(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
money1=root.val
if root.left:
money1+=self.rob(root.left.left)+self.rob(root.left.right)
if root.right:
money1+=self.rob(root.right.left)+self.rob(root.right.right)
money2=self.rob(root.left)+self.rob(root.right)
return max(money1,money2)
后来同学发现了一种非常巧妙的方法,也恰好是最优解,大佬tql。
选择的话最大值只能是当前节点的值和不选它的子节点时的值。
不选择它的话就有几种情况:选择两个子节点、只选其中一个子节点、两个子节点都不选。
然后找出这几种情况的最大值作为当前节点不选择时的值。
然后当前节点选择与不选择的值都返回到当前节点的上一个节点。
上一个节点继续计算选择与不选择的情况。
class Solution(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def rec(root):
if not root:
return 0,0
l_choose,l_notchoose=rec(root.left)
r_choose,r_notchoose=rec(root.right)
curr_choose=root.val+l_notchoose+r_notchoose
curr_notchoose=max(l_choose,l_notchoose)+max(r_choose,r_notchoose)
return curr_choose,curr_notchoose
return max(rec(root))