解题代码:
classSolution {
public:
void res(TreeNode* root){
if(root->left!=NULL)
res(root->left);
if(root->right!=NULL)
res(root->right);
int m=0,n=0;
if(root->right!=NULL){
n+=root->right->val;
if(root->right->left!=NULL)
m+=root->right->left->val;
if(root->right->right!=NULL)
m+=root->right->right->val;
}
if(root->left!=NULL){
n+=root->left->val;
if(root->left->left!=NULL)
m+=root->left->left->val;
if(root->left->right!=NULL)
m+=root->left->right->val;
}
root->val=max(root->val+m,n);
return;
}
int rob(TreeNode* root) {
if(root==NULL)
return 0;
res(root);
return root->val;
}
};
解题思路:
本题也是一题关于关于最大化收益的题目,从题目可以看出,也是需要使用动态规划进行求解,只不过是使用在二叉树的结构上罢了。
我们可以考虑到,对于每个节点,设res(root)为盗窃这一个节点以下的所有节点包括的房屋所能达到的最大收益。明显有:若该节点不存在任何子节点,则res(root)等于root->val。对于其他更一般的情况而言,由于有直接联系关系的两间房子不能同时被盗窃,因此我们可以发现,若我们盗窃了root这间房子,则它的两个子节点所代表的房子都不能被盗窃。所以res(root)会等于以下两个值中较大的一个:一个是res(root->left)+res(root->right),另一个是root->val加上root->left 与root->right的子节点的值。
通过对二叉树自下往上遍历便,最后的res(根节点)便是所求结果。