Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
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.

My code:

# 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 rob1(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        
        check_results1=self.check_rob(root,True)
        check_results2=self.check_rob(root,False)
        return max(check_results1,check_results2)
    def check_rob(self,root,label):
        if root==None:
            return 0
        #print('check root val %d'%root.val)
        if label:
            count1=self.check_rob(root.left,False)
            count2=self.check_rob(root.right,False)
            choose_result=root.val+count1+count2
        else:
            count1=self.check_rob(root.left,True)
            count2=self.check_rob(root.right,True)
            count3=self.check_rob(root.left,False)
            count1=max(count1,count3)
            count4=self.check_rob(root.right,False)
            count2=max(count2,count4)
            choose_result=count1+count2
            
        return choose_result
    def rob(self, root):
        return max(self.f(root))
    def f(self,node):
        if node is None:return [0,0]
        nl,nr = self.f(node.left),self.f(node.right)
        return [node.val+ nl[1]+nr[1], max(nl)+max(nr)]

Solution: https://leetcode.com/problems/house-robber-iii/submissions/