House Robber III
franklinqin0 RecursionTreeDFSDP
# Definition for a Binary Tree Node
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
1
2
3
4
5
2
3
4
5
# Solution
Let be the number of nodes in the tree.
# DP
If robbing the node, the max value is the sum of node.val, max value of NOT robbing the left subtree and NOT robbing the right subtree.
If not robbing the node, the max value is the sum of max of robbing or NOT robbing the left subtree and the max of robbing or NOT robbing the right subtree.
Complexity
time:
space: (due to implicit stack space)
def houseRobber3(self, root):
root_in, root_not_in = self.dfs(root)
return max(root_in, root_not_in)
def dfs(self, node):
if not node:
return (0, 0)
left_in, left_not_in = self.dfs(node.left)
right_in, right_not_in = self.dfs(node.right)
# calculate the values of robbing node
node_in = node.val + left_not_in + right_not_in
node_not_in = max(left_in, left_not_in) + max(right_in, right_not_in)
return (node_in, node_not_in)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14