今天做了一道关于二叉树的题,之所以要记录下,这个题的解法真是太巧妙了
题意:
在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的 地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现 这次的地形是一颗二叉树。与前两次偷窃相似的是每个房子都存放着特定金额的 钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻 的两个房子同一天被打劫时,该系统会自动报警。 算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情 况下。
样例:
3 / 2 3 \ \ 3 1 窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7. 3 / 4 5 / \ \ 1 3 1 窃贼最多能偷窃的金钱数是 4 + 5 = 9.
我们先贴代码,再来看看这个题巧妙在哪里:
1 public int houseRobber3(TreeNode root) { 2 3 int[] result = postTraver(root); 4 return Math.max(result[0], result[1]); 5 } 6 private int[] postTraver(TreeNode root){ 7 if(root == null){ 8 return new int[]{0,0}; 9 } 10 int result[] = new int[2]; 11 int []left = postTraver(root.left); 12 int []right = postTraver(root.right); 13 14 //0表示偷当前的节点,1表示不偷当前的节点 15 //表示偷当前节点,因此两个孩子不能偷 16 result[0] = left[1] + right[1] + root.val; 17 18 //表示不偷当前的节点,因此可以偷两个孩子 19 result[1] = Math.max(left[0], left[1]) + Math.max(right[0], left[1]); 20 21 return result; 22 }
看了代码,我们发现这个题的解法真是巧妙,开辟两个长度的int数组,其中0表示要偷当前的节点,1表示不偷当前的节点。当要偷当前的节点时,两个孩子肯定不偷,因此两个孩子取1,当不偷当前的节点时,这个看情况,可以偷孩子,也可以不偷孩子的,因此需要求最大值。
时间: 2024-10-06 00:55:24