文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【解题思路】
- 七【题目提示】
- 八【时间频度】
- 九【代码实现】
- 十【提交结果】
一【题目类别】
- 树
二【题目难度】
- 中等
三【题目编号】
- 337.打家劫舍 III
四【题目描述】
- 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。
- 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
- 给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。
五【题目示例】
-
示例 1:
- 输入: root = [3,2,3,null,3,null,1]
- 输出: 7
- 解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7
-
示例 2:
- 输入: root = [3,4,5,1,3,null,1]
- 输出: 9
- 解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9
六【解题思路】
- 利用动态规划的思想
- 我们可以注意到,从根节点开始,要么选择根节点,要么不选择根节点,我们只需要这两种情况中收益最大的一种情况,其余的节点也是同理
- 所以我们使用后序遍历整棵树,使用后序遍历的原因是,需要知道下面节点的收益情况
- 如果选择当前节点,那么就加上不选择它的子节点的情况
- 如果不选择当前节点,那么就将选择它的子节点的情况求和(此种情况又和上面其实是一样的,涉及到选还是不选的问题,自然而然就是一个递归)
- 递归结束后返回一个数组,其中包括选根节点和不选根节点的收益情况,我们只需要选择最大的收益
- 最后返回结果即可
七【题目提示】
- 树 的 节 点 数 在 [ 1 , 1 0 4 ] 范 围 内 树的节点数在 [1, 10^4] 范围内 树的节点数在[1,104]范围内
- 0 < = N o d e . v a l < = 1 0 4 0 <= Node.val <= 10^4 0<=Node.val<=104
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为树的节点个数
- 空间复杂度: O ( n ) O(n) O(n),其中 n n n为树的节点个数
九【代码实现】
- Java语言版
class Solution {
public int rob(TreeNode root) {
int[] res = getResByDfs(root);
return Math.max(res[0],res[1]);
}
public int[] getResByDfs(TreeNode root){
if(root == null){
return new int[]{0,0};
}
int[] left = getResByDfs(root.left);
int[] right = getResByDfs(root.right);
int selectVal = root.val + left[1] + right[1];
int noSelectVal = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
return new int[]{selectVal,noSelectVal};
}
}
- C语言版
int* getResByDfs(struct TreeNode* root)
{
if(root == NULL)
{
int* res = (int*)malloc(sizeof(int) * 2);
res[0] = 0;
res[1] = 0;
return res;
}
int* left = getResByDfs(root->left);
int* right = getResByDfs(root->right);
int selectVal = root->val + left[1] + right[1];
int noSelectVal = fmax(left[0],left[1]) + fmax(right[0],right[1]);
int* res = (int*)malloc(sizeof(int) * 2);
res[0] = selectVal;
res[1] = noSelectVal;
return res;
}
int rob(struct TreeNode* root)
{
int* res = getResByDfs(root);
return fmax(res[0],res[1]);
}
十【提交结果】
-
Java语言版
-
C语言版