968.监控二叉树
作者:互联网
968.监控二叉树
题目
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-cameras
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
二叉树的题那么需要先选择哪种遍历方法?
我们需要观察孩子节点是否安装了监控,如果孩子节点安装了监控,那么本节点是不需要安装的。整棵树是自下往上的,选择后序遍历。
套入递归三部曲
确定递归函数的参数和返回值
参数就是该节点TreeNode,我们需要返回当前节点的状态,状态转移。如果状态判断孩子节点是否安装了监控。
设定用int类型表示状态 0 表示没有被覆盖 1 表示被覆盖了 2 表示此节点安装了摄像头
public int dfs(TreeNode node);
终止条件
当然是当前遍历的节点是空了,那么本层递归就要要结束了。返回值是1,因为我们不需要理会空节点,就当它已经被覆盖了
if(node == null) return 1;
本层递归逻辑
首先思考需要安装摄像头的情况
如果该节点的左右孩子有返回0的情况,说明孩子节点没被监控到,那么此节点需要安装摄像头。
那什么时候不用安装摄像头?
有一个孩子状态是2,那么此父节点被监控到了,应该返回1。这里排除了有孩子状态是0的情况
那如果左右孩子都是返回1呢?说明该节点是待覆盖的,返回0。
但是如果根节点返回0,也就是递归函数最后的返回值,就需要我们手动的再加一个摄像头。
int left = dfs(node.left);
int right = dfs(node.right);
//后序遍历
if(left==0 || right == 0) {
count ++;
return 2;
}
else if(right == 2 || left ==2 )return 1;
else return 0;
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int count;
public int minCameraCover(TreeNode root) {
if(dfs(root)==0) count++; //根节点返回0需要我们添加一个摄像头
return count;
}
public int dfs(TreeNode node){
if(node == null) return 1;
int left = dfs(node.left);
int right = dfs(node.right);
//后序遍历
if(left==0 || right == 0) {
count ++; //说明有孩子节点没有被监视,那么就需要添加摄像头
return 2;
} else if(right == 2 || left ==2 )return 1; //说明该节点已经被覆盖了
else return 0;
}
}
标签:right,TreeNode,int,968,二叉树,监控,节点,摄像头,left 来源: https://www.cnblogs.com/rananie/p/15143289.html