视频详解:打家劫舍 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};
}
}