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:
Input: [3,2,3,null,3,null,1]
3
/ \
2 3
\ \
3 1
Output: 7
Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
Input: [3,4,5,1,3,null,1]
3
/ \
4 5
/ \ \
1 3 1
Output: 9
Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9.
LeetCode:链接
本题的做法,就是求本节点+孙子更深节点 vs 儿子节点+重孙更深节点的比较。
用了dfs函数,虽然递归是自顶向下的,但因为是不断的return,所以真正求值是从底向上的。用到了一个有两个元素的列表,分别保存了之前层的,不取节点和取节点的情况。然后遍历左右子树,求出当前节点取和不取能得到的值,再返回给上一层。注意这个里面的robcurr是当前节点能达到的最大值,所以最后返回结果的时候试试返回的root节点robcurr的值。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def dfs(root):
if not root:
return [0, 0]
# 偷左边的
robleft = dfs(root.left)
# 偷右边的
robright = dfs(root.right)
# 如果不偷当前节点 左右子树节点相加
nonrob = robleft[1] + robright[1]
# 如果偷当前结点 左右子树的节点就不能加 同时和不偷相比 保留最大值
rob = max(root.val + robleft[0] + robright[0], nonrob)
return [nonrob, rob]
return dfs(root)[1]