题目:
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 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7 .
Example 2:
3 / \ 4 5 / \ \ 1 3 1Maximum amount of money the thief can rob = 4 + 5 = 9 .
题意:
房子是二叉树形式,不能偷直连(父子形式)的房子,求偷盗的最大金钱数。
代码:
# 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 dfs(self, root) : #深度优先遍历二叉树
if not root :
return [0, 0]
robLeft = self.dfs(root.left) #左子树的偷盗情况,是一个二元组,第一个元素是不偷这个节点,第二个元素是偷这个节点
robRight = self.dfs(root.right) #右子树的偷盗情况,是一个二元组,第一个元素是不偷这个节点,第二个元素是偷这个节点
norobCur = robLeft[1] + robRight[1] #求不偷当前节点时金额最大值,为偷孩子节点的金钱数,包括偷左孩子和偷右孩子,当前节点一定不能偷,否则会报警
robCur = max(robLeft[0] + robRight[0] + root.val, norobCur) #求偷当前节点时金额最大值,实际可以偷,也可以不偷,(如果不偷,则可以连续两个节点都不偷,这是关键)。当前节点的最大值,就为偷该节点与不偷该节点的最大值。其实这里偷包含了不偷的情况
return [norobCur, robCur]
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
lis = [0,0] #二元组,lis[0]表示不偷当前节点,lis[1]表示偷当前节点
lis = self.dfs(root)
return max(lis) #返回偷与不偷根节点的最大值
笔记:
深度优先遍历啊!
参考的是网上的代码
robCur = max(robLeft[0] + robRight[0] + root.val, norobCur) 这个理解起来不那么直观,还是没怎么理解。这是这个题的关键。