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:

1
2
3
4
5
3
/ \
2 3
\ \
3 1

Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

Example 2:

1
2
3
4
5
3
/ \
4 5
/ \ \
1 3 1

Maximum amount of money the thief can rob = 4 + 5 = 9.


递归

一看到树的问题,首先就想到了divide and conque和递归。

对每一个节点,都存在两种状态,一种是偷,一种是不偷。 父节点可以由子节点推出,

  1. 当要偷父节点的时候,子节点一定不能偷
  2. 当不偷父节点的时候,子节点可以偷也可以不偷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class ReturnType {
int stealRoot = 0;
int notStealRoot = 0;
public ReturnType(int stealRoot, int notStealRoot) {
this.stealRoot = stealRoot;
this.notStealRoot = notStealRoot;
}
}
public int rob(TreeNode root) {
ReturnType ans = helper(root);
return Math.max(ans.stealRoot, ans.notStealRoot);
}
public ReturnType helper(TreeNode root) {
if (root == null) {
return new ReturnType(0, 0);
}
ReturnType left = helper(root.left);
ReturnType right = helper(root.right);
return new ReturnType(left.notStealRoot + right.notStealRoot + root.val, Math.max(left.stealRoot, left.notStealRoot) + Math.max(right.stealRoot, right.notStealRoot));
}