這道題的關鍵是是否取當前結點的值,還是取左右孩子的值。如果搜索到了當前的結點,就表示當前結點的值是可以被納入總和之中的,否則就看它的左右孩子的值,而左右孩子的值此時可以被納入總和,因此可以用函數來表示當前的值。
/**
* 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);
}
};