337. House Robber III
- Total Accepted: 30247
- Total Submissions: 73770
- Difficulty: Medium
- Contributors: Admin
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:
3 / \ 2 3 \ \ 3 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
3 / \ 4 5 / \ \ 1 3 1Maximum amount of money the thief can rob = 4 + 5 = 9.
解题思路:
注意到若选取父节点,则其左右子节点均不可选。如果不选取父节点,则左右子节点可以选也可以不选。
代码展示:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
vector<int> help(TreeNode* root){
if(!root) return vector<int> (2,0);
vector<int> left = help(root->left);
vector<int> right = help(root->right);
vector<int> res(2,0);
//res[0]保存不添加root结点的情况
//res[1]保存添加root结点的情况
// res[0] 不包括root结点,所以其子节点可以选择取或者不取
res[0]=max(left[0],left[1])+max(right[0],right[1]);
// res[1] 包括root结点, 所以其子节点不可选取
res[1]=root->val+left[0]+right[0];
return res;
}
public:
int rob(TreeNode* root){
vector<int> result = help(root);
return max(result[0], result[1]);
}
};