這小偷越搶越難的村莊, 這次是一個樹狀圖的房子排列, 一樣兩兩不能相鄰球最大值
這邊我們就是判定當前的房子要不要搶, 不搶的話, 往下一層找就行了
如果要搶, 那就得往下下層找
所以理論上會從最下層開始往上建立, 所以我們用一個map來紀錄我們已經算過的房子
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int rob(TreeNode* root) {
if(!root) return 0;
if(m.count(root)) return m[root];
// do
int do_it= root->val ;
if(root->right && (root->right->right || root->right->left)){
do_it = do_it+ rob(root->right->right) + rob(root->right->left);
}
if(root->left && (root->left->right || root->left->left)){
do_it = do_it + rob(root->left->right) + rob(root->left->left);
}
// not do
int not_do = rob(root->right) + rob(root->left);
int res = max(do_it, not_do);
m[root] = res;
return res;
}
unordered_map<TreeNode *, int> m;
};