来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int rob(TreeNode root) {
int[] res = robTree(root);
return Math.max(res[0], res[1]);
}
public int[] robTree(TreeNode cur) {
if (cur == null) // 递归终止条件,当遇到空节点,偷与不偷都返回0
return new int[]{0,0};
int[] left = robTree(cur.left); // 左子树的盗窃情况
int[] right = robTree(cur.right); // 右子树的盗窃情况
int val1 = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); // 当不偷当前节点时,当前节点的左右孩子节点都能偷,但是要考虑能获取金额最大的方式
int val2 = cur.val + left[0] + right[0]; // 当偷当前节点时,当前节点的左右孩子节点都不能偷
return new int[]{val1, val2};
}
}