思路是:递归解题,rob(根节点)可以分成两种情况:一定有根节点,一定没有根节点。其中,一定有根节点的情况,说明一定没有根节点的两个儿子。
这个方法是自上而下的,因而有许多重复的子问题。时间复杂度较高。
public class Solution {
public int rob(TreeNode root) {
if (root == null) return 0;
int money = root.val;
if (root.left != null) {
money += rob(root.left.left) + rob(root.left.right);
}
if (root.right != null) {
money += rob(root.right.left) + rob(root.right.right);
}
return Math.max(money, rob(root.right) + rob(root.left));
}
}
用从下至上的方法解这道动态规划的题目。
可以看见时间的提升是926倍。
public class Solution {
public int rob(TreeNode root) {
return method(root).val;
}
public TreeNode method(TreeNode node) {
if (node == null){
TreeNode tmp = new TreeNode(0);
tmp.left = new TreeNode(0);
tmp.right = new TreeNode(0);
return tmp;
}
node.left = method(node.left);
node.right = method(node.right);
node.val = Math.max(node.val +
node.left.left.val + node.left.right.val + node.right.left.val + node.right.right.val,
node.left.val + node.right.val);
return node;
}
}