其他分享
首页 > 其他分享> > 968.监控二叉树

968.监控二叉树

作者:互联网

目录

968.监控二叉树

题目

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

示例 1:

image

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

示例 2:

image

输入:[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。
image
但是如果根节点返回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