The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
Input: [3,2,3,null,3,null,1] 3 / 2 3 3 1 Output: 7 Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
Input: [3,4,5,1,3,null,1] 3 / 4 5 / 1 3 1 Output: 9 Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9.
class Solution { public int rob(TreeNode root) { if (root == null) return 0; int leftLevel = 0; int leftSubLevel = 0; if (root.left != null) { leftLevel = rob(root.left); leftSubLevel = rob(root.left.left) + rob(root.left.right); } int rightLevel = 0; int rightSubLevel = 0; if (root.right != null) { rightLevel = rob(root.right); rightSubLevel = rob(root.right.left) + rob(root.right.right); } return Math.max((root.val + leftSubLevel + rightSubLevel), leftLevel + rightLevel); } }
巧,巧夺天工。dfs
https://www.cnblogs.com/reboot329/p/6127932.html
方法2:
class Solution { public int rob(TreeNode root) { int[] res = robRecur(root); return Math.max(res[0], res[1]); } public int[] robRecur(TreeNode root) { if (root == null) { return new int[2]; } int[] left = robRecur(root.left); int[] right = robRecur(root.right); int[] res = new int[2]; // no rob root res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); // rob root res[1] = root.val + left[0] + right[0]; return res; } }
res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);是因为不rob root的值是root的left + root的right,left又有robleft,不robleft。right也一样,所以也是求最大值相加。