Problem:
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.
Explanation:
不能夺取二叉树中两个连着的结点,如何让金钱最大
My Thinking:
My Solution:
Optimum Thinking:
递归返回一个两元素数组,res[0]表示如果不抢劫本结点得到的最大金钱,即抢劫或不抢劫左右两结点的最大值之和,res[1]表示如果抢劫本结点得到的最大金钱,即本节点的金钱+不抢劫左右结点得到的最大金钱。
Optimum Solution:
class Solution {
public int rob(TreeNode root) {
int[] res = robSub(root);
return Math.max(res[0], res[1]);
}
private int[] robSub(TreeNode root) {
if (root == null)
return new int[2];
int[] left = robSub(root.left);
int[] right = robSub(root.right);
int[] res = new int[2];
//res[0]表示如果不抢劫本结点得到的最大金钱,即抢劫或不抢劫左右两结点的最大值之和
res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
//res[1]表示如果抢劫本结点得到的最大金钱,即本节点的金钱+不抢劫左右结点得到的最大金钱
res[1] = root.val + left[0] + right[0];
return res;
}
}