这道题的意思是任何两个相连接的点不能同时被盗。
所以使用递归就可以了,需要记录每个节点的两种情况:
result数组中存的是每个节点算上自己的当前节点的值result[1]和不算自己当前节点的值reslut[0]的情况。
1、不算自己节点,将比较 (node.left)左孩子 算左节点自己节点和 不算左节点自己节点的,去这两种的最大值,然后在同样比较右节点(node.right)的情况。
2、算自己的节点,将现节点(node)和左孩子的resultl[0]和有孩子的resultr[0]相加。
最后得到根节点的result[0],result[1],最后输出最大值。
附上代码:
public class Solution {
public int rob(TreeNode root) {
int[] result=robCount(root);
return Math.max(result[0],result[1]);
}
public int [] robCount(TreeNode node){
if(node==null) return new int[]{0, 0};
int[] result=new int[2];
int[] resultl=robCount(node.left);
int[] resultr=robCount(node.right);
result[0]=Math.max(resultl[0],resultl[1])+Math.max(resultr[0],resultr[1]);//没有算进当前点
result[1]=node.val+resultl[0]+resultr[0];//当前节点算进去
return result;
}
}