问题描述
问题分析
该题是 LeetCode 198. House Robber 和 LeetCode 213. House Robber II 的进阶,只不过形状换成了二叉树,而且解决方法不再是动态规划,而是 DFS. 该题有点像最大活跃度的一个问题。 对于一个以root
为根的树,分为两种情况:
要当前的根节点,那么下一层它的孩子节点肯定不能抢 不要当前的跟节点,那么它的孩子节点可抢可不抢,取其最大值的情况 所以设置递归函数,递归函数的返回值为一个长度为2的数组,那么res[0]
保存要当前根时的最大抢劫值,res[1]
保存不要当前根的最大抢劫值。如何计算这两个值见代码实现
经验教训
该题和最大活跃度的类似思路:根据要不要当前根,返回两个统计值
代码实现
public int rob (TreeNode root) {
if (root == null ) {
return 0 ;
}
int [] res = maxRob(root);
return Math.max(res[0 ], res[1 ]);
}
public int [] maxRob (TreeNode root) {
if (root == null ) {
return new int []{0 , 0 };
}
int [] res = new int [2 ];
int [] leftRes = maxRob(root.left);
int [] rightRes = maxRob(root.right);
res[0 ] = root.val + leftRes[1 ] + rightRes[1 ];
res[1 ] = Math.max(leftRes[0 ], leftRes[1 ]) + Math.max(rightRes[0 ], rightRes[1 ]);
return res;
}