Introduction Link to heading

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.

Solution Link to heading

Recursive solution:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func rob(root *TreeNode) int {
    return max(robR(root))    
}

func robR(root *TreeNode) (int, int) {
    
    if root == nil {
        return 0, 0
    }

    l1, l2 := robR(root.Left)
    r1, r2 := robR(root.Right)

    return max(root.Val + l2 + r2, l1 + r1), max(l1, l2) + max(r1, r2)
}

func max(a, b int) int {
    if a >= b {
        return a
    } else {
        return b
    }
}

Explanation Link to heading

Let’s create a recursive function that will return two maximized revenues: with included root value, and not included root value. Based on that we can make decision on upper level and also return two cases:

  • (root value plus left w/o their root plus right w/o their root) vs (left with their possible root plus right with their possible root )
  • maximize all left or right values without current root value