/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int rob(TreeNode root) {
//计算当前节点偷与不偷所能获得收益,结果存在数组result中
int[] result = countSum(root);
//根据题意可知需取其中最大的
return Math.max(result[0],result[1]);
}
public int[] countSum(TreeNode root){
int[] result = new int[2];
//如果当前节点为空节点,则其结果为0
if(root == null){
return result;
}
//计算当前节点左儿子偷与不偷所能获得的收益
int[] left = countSum(root.left);
//计算当前节点右儿子偷与不偷所能获得的收益
int[] right = countSum(root.right);
//不偷当前节点所能获得的最大收益 = 左儿子所能获得的最大收益 + 右儿子所能获得的最大收益
//0代表偷,1代表不偷
result[0] = Math.max(left[0],left[1])+Math.max(right[0],right[1]);
//偷当前节点所能获得的最大收益= 偷当前节点的钱 + 不偷左儿子所获得的钱 +不偷右儿子所获得的钱
result[1] = root.val+left[0]+right[0];
return result;
}
}