打劫房屋 III-LintCode

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

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

样例:

  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

你可能感兴趣的:(LintCode)