题目内容
House Robber III
Total Accepted: 29353
Total Submissions: 71912
Difficulty: Medium
Contributors: Admin
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.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
题目来源
题目简述
在二叉树中寻找不存在相邻节点集的结点值总和
题目分析
设根节点存储数组为res,左子节点存储数组为left,右子节点存储数组为right。存储数组记录了该节点为根的子树结点值总和,分为两种情况考虑:选择该节点记为1,不选择该节点记为0。则对于每个根节点:
res[0]=max(left[0],left[1])+max(right[0],right[1]);
res[1]=root->val+left[0]+right[0];
其中left,right数组通过同样方式可递归算出。
虽然该函数为递归调用,但是每次计算均仅将左,右子树计算结果汇总,得到根节点存储数组。每个节点仅有一个递归出口,因此不会重复计算,时间复杂度仅为O(n)。
代码示例
/**
* 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) {
vector<int>res=dfs(root);
return max(res[0],res[1]);
}
vector<int> dfs(TreeNode *root)
{
if(root==NULL) return vector<int>(2,0);
vector<int> res(2,0);
vector<int> left=dfs(root->left);
vector<int> right=dfs(root->right);
res[0]=max(left[0],left[1])+max(right[0],right[1]);
res[1]=root->val+left[0]+right[0];
return res;
}
};