用f(root)表示从root节点出发能盗取的最高金额
f(root) = max(f(root->left)+f(root->right), root->val + f(root->left->left)+f(root->left->right) + f(root->right->left) + f(root->right->right))
如果直接这样搜索,为有大量的重复搜索,所以要用hashmap记录状态
/**
* 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 {
public:
unordered_map<TreeNode*,int> hashmap;
int rob(TreeNode* root) {
// rob(root) 表示从根节点出发的最高金额
if(root==NULL) return 0;
if(hashmap.count(root)) return hashmap[root];
int money = root->val;
if(root->left){
money += rob(root->left->left)+rob(root->left->right);
}
if(root->right){
money += rob(root->right->right)+rob(root->right->left);
}
return max(money,rob(root->left)+rob(root->right));
}
};
记忆话优化
class Solution {
public:
unordered_map<TreeNode*,int> hashmap;
int rob(TreeNode* root) {
// rob(root) 表示从根节点出发的最高金额
if(root==NULL) return 0;
if(hashmap.count(root)) return hashmap[root];
int money = root->val;
if(root->left){
money += rob(root->left->left)+rob(root->left->right);
}
if(root->right){
money += rob(root->right->right)+rob(root->right->left);
}
int val = max(money,rob(root->left)+rob(root->right));
hashmap[root] = val;
return val;
}
};