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.
分析
寻找root的最大值有两种情况,一是把root算进去,那么root的两个子节点一定不能算进去,二是root不算进去,那么就可以求两个子节点的最大值,然后计算他们的和。
maxRoot, maxNonRoot分别代表root包不包含进去的值。
maxRoot = maxNonLeftRoot + maxNonRightRoot + root->val
maxNonRoot = max(maxLeftRoot, maxNonLeftRoot) + max(maxRightRoot, maxNonRightRoot)
Code
class Solution {
public:
int rob(TreeNode* root) {
if (!root)
return 0;
int maxRoot = 0;
int maxNonRoot = 0;
getMax(root, maxRoot, maxNonRoot);
return max(maxRoot, maxNonRoot);
}
void getMax(TreeNode* root, int& maxRoot, int& maxNonRoot)
{
if (!root)
{
maxRoot = 0;
maxNonRoot = 0;
return;
}
int leftRoot, rightRoot, leftNonRoot, rightNonRoot;
getMax(root->left, leftRoot, leftNonRoot);
getMax(root->right, rightRoot, rightNonRoot);
maxRoot = root->val + leftNonRoot + rightNonRoot;
maxNonRoot = max(leftRoot, leftNonRoot) + max(rightRoot, rightNonRoot);
return;
}
};
运行效率
Runtime: 12 ms, faster than 99.23% of C++ online submissions for House Robber III.
Memory Usage: 20.8 MB, less than 67.06% of C++ online submissions for House Robber III.