力扣:337. 打家劫舍 III

力扣题:337. 打家劫舍 III

视频详解:打家劫舍 III

思路分析:

假设我们自行选择了所有未相连的节点,那么剩下其实也是未相连的节点。

但倘若我们自己乱选,并没有规律可循,实现起来相当困难。

由此,我们以根节点作为是否选择的情形分为两种情况:

情况 一:选择了根节点,将所有被选中的子根节点与根节点相加

情况 二:未选根节点,那么将左子节点同左子节点的子节点进行比较 取得较大值(右子节点同理),左右两边的较大值相加得到最大的情况。

最后取两种情况产生的值更大者返回得出结果。

如图:

代码部分:

class Solution {
    public int rob(TreeNode root) {
        int[] compare = dfs(root);
        int max = Math.max(compare[0],compare[1]);
        return max;

    }
//深度优先搜索
    public int[] dfs(TreeNode node) {
        if (node == null) {
            return new int[]{0,0};
        }
        int[] l = dfs(node.left); //向左边得到,已选和未选的值
        int[] r = dfs(node.right); //向右边得到,已选和未选的值
        int select_root = node.val + l[1] + r[1]; //
        int notSelect_root = Math.max(l[0],l[1]) + Math.max(r[0],r[1]);
        return new int[]{select_root,notSelect_root};
    }
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值