337 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
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
3
/ \
4 5
/ \ \
1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.
为啥我的代码通不过
#include <iostream>
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)
return 0;
std::queue<TreeNode*> level[2];
int current = 0;
int next =1;
int sum[2] = {0, 0};
level[0].push(root);
while(!level[0].empty() || !level[1].empty())
{
TreeNode* pNode = level[current].top();
level[0].pop();
sum[current] += pNode->val;
if(current == 0){
if(pNode->left != NULL)
level[next].push(pNode->left);
if(pNode->right != NULL)
level[next].push(pNOde->right);
}
else{
if(pNode->left != NULL)
level[next].push(pNode->left);
if(pNode->right != NULL)
level[next].push(pNode->right);
}
if(level[current].empty()){
current = 1-current;
next = 1- next;
}
}
return sum[0]>sum[1]?sum[0]: sum[1];
}
};
不就是计算奇偶层的和么
参考别人的代码:
C++
class Solution {
public:
int rob(TreeNode* root) {
return dfs(root).first;
}
pair<int, int> dfs(TreeNode* root){
pair<int, int> dp = make_pair(0,0);
if(root){
pair<int, int> dp_L = dfs(root->left);
pair<int, int> dp_R = dfs(root->right);
dp.second = dp_L.first + dp_R.first;
dp.first = max(dp.second ,dp_L.second + dp_R.second + root->val);
}
return dp;
}
};