思路--动态规划算法:
如果偷了当前节点,那么当前节点的左右子树不可以偷;如果不偷当前节点,左右子树可偷可不偷。用v1表示偷当前节点,v2表示不偷当前节点。
# leetcode submit region begin(Prohibit modification and deletion)
# 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: TreeNode) -> int:
def dfs(root):
if not root:
return 0,0 # [偷,不偷]
left = dfs(root.left)
right = dfs(root.right)
# v1表示偷当前节点
v1=root.val+left[1]+right[1]
# v0表示不偷当前节点,左右子树可偷可不偷
v2=max(left)+max(right)
#print(left)
print(right)
return v1,v2
return dfs(root)
# leetcode submit region end(Prohibit modification and deletion)