这其实是一个在“图”上选或者不选的问题。因为这是一棵二叉树,所以选或者不选主要是对当前节点及其左右子树进行判断。如果选当前节点,则意味着-------;如果不选当前节点,则意味着------。(用文字不容易说清楚,直接见代码即可)。
class Solution {
public:
pair<int,int> dfs(TreeNode* root)
{
if(root==NULL) return make_pair(0,0);//递归的出口条件要把握好,因为是叶子节点,选或者不选都是0。
pair<int,int> left=dfs(root->left);//跳出对这种形式的认识。看似是后序遍历,其实跟什么序没有关系,只是因为后面的ret需要
//用到左右子树的结果
pair<int,int> right=dfs(root->right);
pair<int,int> ret;
//下面这两句是抽象该题意的关键
ret.first=max(left.first,left.second)+max(right.first,right.second); //first代表不选当前节点
ret.second=root->val+left.first+right.first;
return ret;
}
int rob(TreeNode* root) {
auto temp=dfs(root);//返回的是一个pair,所以还要选择最大的那个
return max(temp.first,temp.second);
}
};