# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
res = self.travel(root)
return max(res)
def travel(self,cur):
if cur == None:
return [0,0]
dp_l = self.travel(cur.left)
dp_r = self.travel(cur.right)
#不偷的情况:分别取左右两个孩子最大的情况
val_1 = max(dp_l) + max(dp_r)
#偷的情况:左右两个孩子都不能偷
val_2 = cur.val + dp_l[0] + dp_r[0]
return [val_1,val_2]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
#基本思路:爷爷节点+四个孙子节点 与 两个孩子节点的和 作比较
#这样孙子节点计算了两遍
if root == None:
return 0
money = root.val
if root.left != None:
money += (self.rob(root.left.left) + self.rob(root.left.right))
if root.right != None:
money += (self.rob(root.right.left) + self.rob(root.right.right))
return max(money, self.rob(root.left)+self.rob(root.right))
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
#基本思路:爷爷节点+四个孙子节点 与 两个孩子节点的和 作比较
#使用memo减少计算
memo = {}
return self.ron_memo(root,memo)
def ron_memo(self,cur,memo):
if cur == None:
return 0
if cur in memo:
return memo[cur]
money = cur.val
if cur.left != None:
money += (self.ron_memo(cur.left.left,memo) + self.ron_memo(cur.left.right,memo))
if cur.right != None:
money += (self.ron_memo(cur.right.left,memo) + self.ron_memo(cur.right.right,memo))
result = max(money, self.ron_memo(cur.left,memo)+self.ron_memo(cur.right,memo))
memo[cur] = result
return result