leetcode_337. House Robber III 大盗抢劫,房子是二叉树形式,深度优先遍历

题目:

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 .


题意:

房子是二叉树形式,不能偷直连(父子形式)的房子,求偷盗的最大金钱数。


代码:

# 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) 这个理解起来不那么直观,还是没怎么理解。这是这个题的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值