二、解题思路
- 错误思路:刚开始我以为只要隔层相加取最大就行了,但是不是这么回事,因为
[1, 2, null, 2, 5]
应该返回1 + 5 = 6
,隔层只相加一部分是完全有可能的
- 正确思路
- 假设从
root
节点开始
- 如果抢劫了
root
节点,那么一定不可能抢劫root->left
和root->right
,只能是抢劫完root
之后继续抢劫root->left
和root->right
的子树,得到一个值sum
。而不是root->left
和root->right
。之后用这个sum
加上root->val
,才是root
节点作为入口的解,设这个解为res1
- 反之,如果不抢劫,那就把
root->left
和root->right
作为两个入口,抢劫root->left
之后抢劫root->right
,得到这种情况下的解,设这个解为res2
- 于是,两种情况可以写成一个递归函数
- 需要返回时,返回两个解中较大的那个
三、解题代码
class Solution {
unordered_map<TreeNode*, int> sums;
public:
int rob(TreeNode* root) {
if(!root) return 0;
if(sums.count(root)) return sums[root];
int res1 = 0;
if(root->left)
res1 += (rob(root->left->left) + rob(root->left->right));
if(root->right)
res1 += (rob(root->right->left) + rob(root->right->right));
res1 += root->val;
int res2 = rob(root->left) + rob(root->right);
sums[root] = max(res1, res2);
return sums[root];
}
};
四、运行结果