535 · 打劫房屋 III

在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树。与前两次偷窃相似的是每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻的两个房子同一天被打劫时,该系统会自动报警

算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。

这题是House RobberHouse Robber II的扩展,只不过这次地形由直线和圈变成了二叉树

样例

样例1

 
输入:  {3,2,3,#,3,#,1}
输出: 7
解释:
最多能偷 3 + 3 + 1 = 7.
  3
 / \
2   3
 \   \ 
  3   1

样例2

 
输入:  {3,4,5,1,3,#,1}
输出: 9
解释:
最多能偷 4 + 5 = 9.
    3
   / \
  4   5
 / \   \ 
1   3   1

vector<int> reverse(TreeNode *root)
{
    if (nullptr == root)
    {
        return vector<int>(2, 0);
    }
    //后序遍历
    vector<int> leftVec = reverse(root->left);
    vector<int> rigthVec = reverse(root->right);

    vector<int> ret(2, 0);
    //ret[1] = root->val;
    root->val = root->val < 0 ? 0 : root->val;
    int tmp1 = leftVec[0] + rigthVec[0]; //左孙+右孙
    int tmp2 = root->val +tmp1;//左孙+右孙+父
    int tmp3 = leftVec[0] + rigthVec[1]; //左孙+右子
    int tmp4 = leftVec[1] + rigthVec[0]; //左子+右孙
    int tmp5 = leftVec[1] + rigthVec[1]; //左子+右子

    int maxRet = max(tmp1, tmp3);
    maxRet = max(maxRet, tmp4);
    maxRet = max(maxRet, tmp5);
    ret[1] = tmp2;
    ret[0] = maxRet;
    return ret;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值