这道题的关键是是否取当前结点的值,还是取左右孩子的值。如果搜索到了当前的结点,就表示当前结点的值是可以被纳入总和之中的,否则就看它的左右孩子的值,而左右孩子的值此时可以被纳入总和,因此可以用函数来表示当前的值。
/**
* 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>mp;
int rob(TreeNode* root) {
return deal(root);
}
int deal(TreeNode* root)
{
if(!root) return 0;
if(mp.count(root)) return mp[root];
//取值node
int sum1 = root->val;
if(root->left)
sum1 += deal(root->left->left) + deal(root->left->right);
if(root->right)
sum1 += deal(root->right->left) + deal(root->right->right);
//不取node
int sum2 = deal(root->left)+deal(root->right);
return mp[root] = max(sum1,sum2);
}
};