LeetCode - 337. House Robber III

解题代码:

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(根节点)便是所求结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值