您的位置:首页 > 其它

337. House Robber III 【M】【vip】

2016-05-11 20:43 197 查看
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place
forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.

Determine the maximum amount of money the thief can rob tonight without alerting the police.

Example 1:

3
/ \
2   3
\   \
3   1

Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

Example 2:

3
/ \
4   5
/ \   \
1   3   1

Maximum amount of money the thief can rob = 4 + 5 = 9.

Credits:

Special thanks to @dietpepsi for adding this problem and creating all test cases.

Subscribe to
see which companies asked this question

本质上是一个树的遍历 问题

这个刚开始想错了,为什么不能用广搜呢,因为并不是如果我不rob树根,就一定要rob他的两个子节点。也就是说,有可能我只rob他的一个子节点会更好。

f1(node)
be the value of maximum money we can rob from the subtree with
node
as
root ( we can rob
node
if necessary).

f2(node)
be the value of maximum money we can rob from the subtree with
node
as
root but without robbing
node
.

Then we have

f2(node) = f1(node.left) + f1(node.right)
and

f1(node) = max( f2(node.left)+f2(node.right)+node.value, f2(node) )
.

class Solution(object):
def do(self,root):
if root == None:
return (0,0)

l = self.do(root.left)
r = self.do(root.right)

return (l[1] + r[1] , max(l[1] + r[1] , l[0] + r[0] + root.val))

def rob(self, root):
return self.do(root)[1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: