原题链接
解题思路
找了一下午的突破口。后面根据其他人的答案找到了。遗憾不是自己独立完成的。
此题考察dfs和动态规划吧。子问题:每一个节点都有两种操作,选自己或不选自己。两种操作对应了两个最大值。然后dfs到最深处,再自底向上的解决整个问题。
- 创建dfs方法。
- 根据题意,如果选了自己,则不能选他的孩子,则得到选自己的最大值等于自己的值加上孩子没选自己的最大值。详见代码
- 如果没选自己,则可以选他孩子也可以不选。则得到不选自己的最大值等于其孩子选自己或不选自己的最大值的和。详见代码
解题代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int[] dfs(TreeNode root){
if(root == null) return new int[2];
int[] res = new int[2];
int[] left = dfs(root.left);
int[] right = dfs(root.right);
res[0] = root.val + left[1] + right[1];
res[1] = Math.max(left[0],left[1]) + Math.max(right[0] , right[1]);
return res;
}
public int rob(TreeNode root) {
int[] ans = dfs(root);
return Math.max(ans[0],ans[1]);
}
}