337.打家劫舍 III

Posted HardyDragon_CC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了337.打家劫舍 III相关的知识,希望对你有一定的参考价值。

337.打家劫舍 III

思路

  • 题目要求不能同时偷父结点和其孩子结点。要么偷父结点,要么偷其两个孩子结点。
  • 这里可以使用一个长度为2的状态数组,记录当前节点偷与不偷所得到的的最大金钱。
  • 关于树的的遍历这里使用后序遍历,左右根。最后返回的就是根节点的dp数组中的偷与不偷当前结点的金额的最大值。
class Solution {
    public int rob(TreeNode root) {
        int[] dp = robrec(root);
        return Math.max(dp[0],dp[1]);
    }
    int[] robrec(TreeNode root){
        int[] res = new int[2];
        if(root == null) return res;
        int[] left = robrec(root.left);
        int[] right = robrec(root.right);

        // 不偷当前结点,考虑孩子结点的最大金额
        res[0] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
        // 偷当前结点,其孩子结点不考虑
        res[1] = root.val + left[0] + right[0];
        return res;
    }
}

总结

  • 关于树的一般思考到遍历方式,前中后、bfs/dfs…
  • 递归函数先确定其函数的作用和返回值、终止条件。

以上是关于337.打家劫舍 III的主要内容,如果未能解决你的问题,请参考以下文章

题目地址(337. 打家劫舍 III)

337.打家劫舍 III

337.打家劫舍 III

Leetcode 337. 打家劫舍 III

Leetcode 337. 打家劫舍 III

337. 打家劫舍 III