337. House Robber III

(1) 每个Node分为要用不要用两种case。

(2) 如果当前root要被使用,那么相邻的node遍布可以使用;

(3) 如果当前node不被使用,那么相邻node可以用也可以不用,找到最大值相加。

class Solution {
public:

    //select----------是root使用

   //non-------------root不被使用
    void dfs(TreeNode* root,int &select, int &non){
       if(root == NULL) return;
       
        int ls = 0; //use left
        int ln = 0; //not use left
        
        int rs = 0; //use right
        int rn = 0; // not use right
        
        dfs(root->left,ls,ln);
        dfs(root->right,rs,rn);
        
        select += ln  +  rn  +   root->val; //root的值使用了,left,right的值都不可是使用.
        non += max(ls,ln) + max(rs,rn); //not use root. max(left) + max(right);
    }
    int rob(TreeNode* root) {
        if(root == NULL)
            return 0;
        int select = 0;
        int non = 0;
        dfs(root,select,non);
        
        return max(select,non);
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值