<LeetCode OJ> 337. House Robber III

原创 2016年03月14日 23:41:39

Total Accepted: 1341 Total Submissions: 3744 Difficulty: Medium

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:
    int rob(TreeNode* root) {
        if(root==NULL)  
            return 0;  
        queue<TreeNode*> que;//用来总是保存当层的节点  
        que.push(root);  
        int oddsum =root->val;//用于统计奇数层的和
        int evensum=0;  //用于统偶数层的和
        //获取每一层的节点
        int curlevel=2;
        while(!que.empty())  
        {  
            int levelSize = que.size();//通过size来判断当层的结束  
            for(int i=0; i<levelSize; i++)   
            {  
                if(que.front()->left != NULL) //先获取该节点下一层的左右子,再获取该节点的元素,因为一旦压入必弹出,所以先处理左右子  
                    que.push(que.front()->left);  
                if(que.front()->right != NULL)   
                    que.push(que.front()->right);  
                if(curlevel % 2 ==1)
                    oddsum  += que.front()->val;
                else
                    evensum += que.front()->val;
                que.pop();  
            }  
            curlevel++;
        }
        return oddsum > evensum ? oddsum : evensum;//奇数层的和与偶数层的和谁更大谁就是结果
    }
};


学习别人的代码:

int rob(TreeNode* root) {
    int child = 0, childchild = 0;
    rob(root, child, childchild);
    return max(child, childchild);
}

void rob(TreeNode* root, int &child, int &childchild) {
    if(!root) return;

    int l1 = 0, l2 = 0, r1 = 0, r2 = 0;
    rob(root->left, l1, l2);
    rob(root->right, r1, r2);

    child = l2 + r2 + root->val;
    childchild = max(l1, l2) + max(r1, r2);
}




注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50890931

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

版权声明:本文为EbowTang原创文章,后续可能继续更新本文。如果转载,请务必复制本文末尾的信息!

[leetcode-337]House Robber III(java)

原题:House RobberIII对于这种树形结构,应该很容易想到使用递归的方法,这里的难点在于递归的时候相邻点不能同时访问,因此我写成了第一种做法,也ac了,但是这样并不好,因为它对很多点都会重复...
  • zdavb
  • zdavb
  • 2016年03月27日 22:19
  • 825

[leetcode] 337. House Robber III

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • TstsUgeg
  • TstsUgeg
  • 2016年03月12日 20:20
  • 2327

LeetCode337. House Robber III

题目: https://leetcode.com/problems/house-robber-iii/ The thief has found himself a new place for hi...
  • codeTZ
  • codeTZ
  • 2016年03月23日 20:34
  • 1098

leetcode 337. House Robber III-动态规划|Java|Python简洁高效

原题链接:337. House Robber III 【思路】 和 House Robber 十分类似,是Dynamic Programming问题。这里使用递归来实现,数组rob来存储。rob[0...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016年03月13日 21:06
  • 4641

337. House Robber III (C++实现)

解题思路: 递归求解,若为空树返回0; 若只有一个根结点就返回根结点的值; 否则,若根结点有孩子,两种抢法:抢根结点!不抢根结点,抢根结点的孩子子树!取最大值(选抢的多的方案)! (注:抢根结点,就不...
  • jingmiaa
  • jingmiaa
  • 2016年05月09日 18:41
  • 423

leetCode198-House Robber

链接:https://leetcode.com/problems/house-robber/ 这道理可以看做是状态压缩,每两个数字看做是一行,状态有3个,故需要F[N][3]的数组,F[i][j]就表...
  • Lu597203933
  • Lu597203933
  • 2015年04月01日 18:28
  • 7397

Leetcode_198_House Robber

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/47680663 You are a profes...
  • pistolove
  • pistolove
  • 2015年08月15日 12:02
  • 2108

[leetcode]337. House Robber III

采用深度优先搜索,定义一个函数DFS,函数通过引用返回两个值,rob root节点能够得到的最大金钱r1,以及不rob root节点能够得到的最大金钱r2。代码如下: void DFS(Tree...
  • zorelemn
  • zorelemn
  • 2016年04月13日 22:44
  • 134

198. House Robber Leetcode Python

You are a professional robber planning to rob houses along a street. Each house has a certain amount...
  • hyperbolechi
  • hyperbolechi
  • 2015年03月31日 22:28
  • 1258

leetcode 337. House Robber III

原题链接原题链接解题思路找了一下午的突破口。后面根据其他人的答案找到了。遗憾不是自己独立完成的。 此题考察dfs和动态规划吧。子问题:每一个节点都有两种操作,选自己或不选自己。两种操作对应了两个最大...
  • jly0612
  • jly0612
  • 2016年07月05日 16:12
  • 151
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:<LeetCode OJ> 337. House Robber III
举报原因:
原因补充:

(最多只允许输入30个字)