您的位置:首页 > 其它

打劫房屋 III-LintCode

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

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

样例:

3
/ \
2   3
\   \
3   1


窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.

3
/ \
4   5
/ \   \
1   3   1


窃贼最多能偷窃的金钱数是 4 + 5 = 9.

思路:

修改二叉树每个节点的值,返回根节点值为最后结果。

对于如下矩阵

a
/ \
b   c
/ \  /\
d  e f g


a->val=max(b+c,d+e+f+g)

用此方法遍历每个节点,得到最终结果。

#ifndef C535_H
#define C535_H
#include<iostream>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int val)
{
this->val = val;
this->left = this->right = NULL;
}
};
class Solution {
public:
/*
* @param root: The root of binary tree.
* @return: The maximum amount of money you can rob tonight
*/
int houseRobber3(TreeNode * root) {
// write your code here
if (root == NULL)
return 0;
int a = houseRobber3(root->left);
int b = houseRobber3(root->right);
int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
if (root->left != NULL)
{
if (root->left->left != NULL)
num1 = root->left->left->val;
if (root->left->right != NULL)
num2 = root->left->right->val;
}
if (root->right != NULL)
{
if (root->right->left != NULL)
num3 = root->right->left->val;
if (root->right->right != NULL)
num4 = root->right->right->val;
}
root->val = maxVal(a + b, num1 + num2 + num3 + num4 + root->val);
return root->val;
}
int maxVal(int a, int b)
{
return a > b ? a : b;
}
};
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: