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 .
Code:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct dpValue {
dpValue(int v1 = 0, int v2 = 0) {
takingVal = v1;
notTakingVal = v2;
}
int takingVal;
int notTakingVal;
};
class Solution {
public:
int rob(TreeNode* root) {
dpValue ans = solve( root );
return (ans.takingVal > ans.notTakingVal)? ans.takingVal : ans.notTakingVal;
}
dpValue solve( TreeNode *root ) {
if( root == NULL )
return dpValue();
dpValue cur( root->val, 0 );
dpValue leftVal = solve(root->left);
dpValue rightVal = solve(root->right);
cur.takingVal += (leftVal.notTakingVal+rightVal.notTakingVal);
cur.notTakingVal += ( (leftVal.takingVal > leftVal.notTakingVal)? leftVal.takingVal : leftVal.notTakingVal );
cur.notTakingVal += ( (rightVal.takingVal > rightVal.notTakingVal)? rightVal.takingVal : rightVal.notTakingVal );
return cur;
}
};