我们可以用 f(o)f(o) 表示选择 oo 节点的情况下,oo 节点的子树上被选择的节点的最大权值和;g(o)g(o) 表示不选择 oo 节点的情况下,oo 节点的子树上被选择的节点的最大权值和;ll 和 rr 代表 oo 的左右孩子。
当 oo 被选中时,oo 的左右孩子都不能被选中,故 oo 被选中情况下子树上被选中点的最大权值和为 ll 和 rr 不被选中的最大权值和相加,即 f(o) = g(l) + g(r)f(o)=g(l)+g(r)
当 oo 不被选中时,oo 的左右孩子可以被选中,也可以不被选中。对于 oo 的某个具体的孩子 xx,它对 oo 的贡献是 xx 被选中和不被选中情况下权值和的较大值。故 g(o)=max{f(l),g(l)}+max{f(r),g(r)}
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def rob(self, root: TreeNode) -> int:
##caiyong houxu bianli
def helper(root):
if not root:
return 0,0
left_1,left_0=helper(root.left)
right_1,right_0=helper(root.right)
root_1=left_0+right_0+root.val
root_0=max(left_0+right_0,left_1+right_1,left_0+right_1,left_1+right_0)
return root_1,root_0
return max(helper(root))