给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例1:
输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
思路 + 代码
0=>这个结点待覆盖
1=>这个结点已经覆盖
2=>这个结点上安装了相机。
整个递归采用后序遍历,先确定子节点的状态,然后用子节点的状态来确定父节点的状态,从树的底层向上来确定最小的相机数量。
该思路很好,主要是怎么证明结果是最小值呢?
其实在叶节点安装相机,那么相机数量一定不是最少的(有可能是最少的),完全可以在叶节点的父节点安装相机。
class Solution {
public int count = 0;
public int minCameraCover(TreeNode root) {
if (core(root) == 0) count++;
return count;
}
public int core(TreeNode node){
if (node == null) return 1;
int left = core(node.left);
int right = core(node.right);
if (left == 0 || right == 0) {
// 如果子节点有一个需要覆盖,则该节点必须安装相机
count++;
return 2;
}
if (left == 1 && right == 1) //如果两个子节点都覆盖了,那么父节点便没必要安装相机
return 0;
// left + right >= 3 说明至少有一个子节点安装了相机 那么本节点不需要安装相机
return 1;
}
}