题意分析:宿舍成二叉树排布,直接相邻的两个节点不能同时被盗,求最大盗取金额
解题思路:递归后续遍历法
#include<iostream>
#include<algorithm>
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};
class Solution {
public:
int rob(TreeNode* root) {
int UseMax = 0, UnUseMax = 0;
postTraverse(root, UseMax, UnUseMax);
return std::max(UseMax, UnUseMax);
}
void postTraverse(TreeNode* ptr, int& UseMax, int& UnUseMax) {
if (ptr == nullptr) {
UseMax = 0;
UnUseMax = 0;
return;
}
int leftUseMax = 0, leftUnUseMax = 0, rightUseMax = 0, rightUnUseMax = 0;
postTraverse(ptr->left, leftUseMax, leftUnUseMax);
postTraverse(ptr->right, rightUseMax, rightUnUseMax);
UseMax = leftUnUseMax + rightUnUseMax + ptr->val;
UnUseMax = std::max(leftUnUseMax, leftUseMax) + std::max(rightUnUseMax, rightUseMax);
}
};