题目
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
解题
具体见注释 三种状态的递推
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int res = 0;
public int minCameraCover(TreeNode root) {
//动态规划
//设置三种状态 之间可进行状态转移完成摄像头的放置
//0:表示当前节点未放摄像头但能监视到 => 说明其父节点状态是1
//1:表示当前节点未放摄像头但不能监视到 =>说明其父节点需要状态是2 即放摄像头,这样摄像头数量加1
//2:表示当前节点放了摄像头 => 说明其父节点状态是0
//dfs自上而下递归+动态规划自下而上递推
if(dfs(root)== 1) res++;//注意,当根节点的左右节点递推出来状态都为0的时候,需要在root节点多加一个摄像头
return res;
}
public int dfs(TreeNode root){
if(root == null){
return 0;//表示当前节点的父节点是叶子节点,状态初始是1
}
int leftstate = dfs(root.left);
int rightstate = dfs(root.right);
if(leftstate == 1 || rightstate == 1){
//当左右子节点有一个不能被监视到,说明需要在父结点上放置摄像头,摄像头数量加1
res++;
return 2;
}else if(leftstate == 2 || rightstate == 2){
//当左右子节点有一个有摄像头,说明父节点能被监视到且不需有镜头,返回0
return 0;
}else if{
return 1;
}
}
}