leetcode---House Robber III

本文探讨了一个有趣的问题:窃贼如何在形如二叉树布局的住宅区中,最大化其抢劫金额的同时避免触动报警系统。文章通过递归算法解决这一问题,并提供了具体的代码实现。

The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the “root.” Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that “all houses in this place forms a binary tree”. It will automatically contact the police if two directly-linked houses were broken into on the same night.

Determine the maximum amount of money the thief can rob tonight without alerting the police.

Example 1:
3
/ \
2 3
\ \
3 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
3
/ \
4 5
/ \ \
1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    struct Money
    {
        int steal;     //该结点偷,收益为本结点偷与左右子结点不偷收益之和
        int notSteal;  //该结点不偷,收益为左右子结点偷收益之和

        Money()
        {
            steal = 0;
            notSteal = 0;
        }
    };

    Money dfs(TreeNode* root)
    {
        if(root == NULL)
            return Money();
        Money left = dfs(root->left);
        Money right = dfs(root->right);
        Money sum;
        sum.notSteal = left.steal + right.steal;   
        sum.steal = max(sum.notSteal, root->val + left.notSteal + right.notSteal);
        return sum;
    }

    int rob(TreeNode* root) 
    {
        Money m = dfs(root);
        return m.steal;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值