题目:
例子:
思路:
题目中的主要思想如下:
1.当前节点选择偷的话,那只能偷孙子节点,即偷:当前节点的值+孙子节点的值
2.当前节点选择不偷的话,那就偷儿子节点的值。
直接使用dfs暴力的话会超时,因此使用记忆化搜索储存起来,或者采用数组的形式来存储。
代码思路如下:
- 定义一个result数组来存储当前节点是否偷:0表示不偷当前节点,1表示偷当前节点
- 定义left和right数组表示偷左孩子和右孩子
- result[0]表示不偷当前节点,则result[0]表示左右孩子能偷到的最大值,result[1]表示当前节点和孙子节点的最大值
代码:
class Solution {
public int rob(TreeNode root) {
int[] result = dfs(root);
return Math.max(result[0],result[1]);
}
public int[] dfs(TreeNode root){
if(root==null) return new int[2];
int[] result = new int[2];
int[] left = dfs(root.left);
int[] right = dfs(root.right);
result[0] = Math.max(left[0],left[1]) +Math.max(right[0],right[1]);
result[1] = left[0]+right[0]+root.val;
return result;
}
}