2022/01/[路飞][LeetCode]968_监控二叉树/index

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

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

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

示例 1:

image.png

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

示例 2:

image.png

1
2
3
输入: [0,0,null,0,null,0,null,null,0]
输出: 2
解释: 需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。

提示:

  1. 给定树的节点数的范围是 [1, 1000]
  2. 每个节点的值都是 0。

解题思路

  • 我们想要摄像头最少,那么就需要尽量往父节点装(装在父节点可以监视到两个子节点)
  • 我们用0来表示没覆盖到的, 1表示覆盖到的, 2表示安装摄像头的位置
  • 我们使用后续遍历
  • 对父节点进行判断,如果节点安装了摄像头,首先数量+1,如果该节点的父节点存在且没被覆盖,则将其标为覆盖
  • 如果该节点没被覆盖,我们先判断他有没有父节点,有的话将其父节点设为摄像头位,并将该节点标记为覆盖到
  • 该节点为头结点,将其标记为摄像头位并数量+1

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var minCameraCover = function(root) {
let n = 0
function preorder(node){
if(node.left){
node.left.parent = node
preorder(node.left)
}
if(node.right){
node.right.parent = node
preorder(node.right)
}
if(node.val==2){
n++
if(node.parent&&!node.parent.val) node.parent.val=1
}else if(node.val==0){
if(node.parent) node.parent.val = 2,node.val = 1;
else node.val = 2,n++;
}
}
preorder(root)
return n
};

时间不会停下来等你,我们现在过的每一天,都是余生中最年轻的一天。

如有任何问题或建议,欢迎留言讨论!

文章作者: Joker
文章链接: https://qytayh.github.io/2022/01/[%E8%B7%AF%E9%A3%9E][LeetCode]968_%E7%9B%91%E6%8E%A7%E4%BA%8C%E5%8F%89%E6%A0%91/index/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog