一棵树的最大收益=max(含根的最大收益,不含根的最大收益)
sum = max(sumWithRoot,sumWithoutRoot);
含根的最大收益=不含左子树根的左子树的最大收益+不含右子树根的右子树的最大收益+根
sumWithRoot = sumWithoutLeftRoot+sumWithoutRightRoot+root->val;
不含根的最大收益=含左子树根的左子树的最大收益+含右子树根的右子树的最大收益
sumWithoutRoot = max(sumWithLeftRoot,sumWithoutLeftRoot)+max(sumWithoutRightRoot,sumWithRightRoot);
/**
* 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:
int sumMax = 0;
int rob(TreeNode* root) {
if(!root) return 0;
int sumWithoutRoot=0;
robCore(root,sumWithoutRoot);
return sumMax;
}
int robCore(TreeNode* root,int &sumWithoutRoot){
if(!root){
sumWithoutRoot=0;
return 0;
}
if(!root->left && !root->right){
sumWithoutRoot=0;
sumMax = max(sumMax,root->val);
return root->val;
}
int sumWithoutLeftRoot=0,sumWithoutRightRoot=0;
int sumWithLeftRoot = robCore(root->left,sumWithoutLeftRoot);
int sumWithRightRoot = robCore(root->right,sumWithoutRightRoot);
int sumWithRoot = sumWithoutLeftRoot+sumWithoutRightRoot+root->val;
sumWithoutRoot = max(sumWithLeftRoot,sumWithoutLeftRoot)+max(sumWithoutRightRoot,sumWithRightRoot);
int sum = max(sumWithRoot,sumWithoutRoot);
sumMax = max(sumMax,sum);
return sumWithRoot;
}
};