在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树。与前两次偷窃相似的是每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻的两个房子同一天被打劫时,该系统会自动报警。
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
这题是House Robber和House Robber II的扩展,只不过这次地形由直线和圈变成了二叉树
样例
样例1
输入: {3,2,3,#,3,#,1}
输出: 7
解释:
最多能偷 3 + 3 + 1 = 7.
3
/ \
2 3
\ \
3 1
样例2
输入: {3,4,5,1,3,#,1}
输出: 9
解释:
最多能偷 4 + 5 = 9.
3
/ \
4 5
/ \ \
1 3 1
vector<int> reverse(TreeNode *root)
{
if (nullptr == root)
{
return vector<int>(2, 0);
}
//后序遍历
vector<int> leftVec = reverse(root->left);
vector<int> rigthVec = reverse(root->right);
vector<int> ret(2, 0);
//ret[1] = root->val;
root->val = root->val < 0 ? 0 : root->val;
int tmp1 = leftVec[0] + rigthVec[0]; //左孙+右孙
int tmp2 = root->val +tmp1;//左孙+右孙+父
int tmp3 = leftVec[0] + rigthVec[1]; //左孙+右子
int tmp4 = leftVec[1] + rigthVec[0]; //左子+右孙
int tmp5 = leftVec[1] + rigthVec[1]; //左子+右子
int maxRet = max(tmp1, tmp3);
maxRet = max(maxRet, tmp4);
maxRet = max(maxRet, tmp5);
ret[1] = tmp2;
ret[0] = maxRet;
return ret;
}