LeetCode 968.监控二叉树 (hard)

968.监控二叉树

力扣题目链接(opens new window)

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

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

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

贪心思路:

从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少

                      整体最优:全部摄像头数量所用最少

确定遍历顺序

可以使用后序遍历也就是左右中的顺序,这样就可以在回溯的过程中从下到上进行推导了

 // 后序遍历,从下往上传递状态
    let left = dfs(n.left)     // 获取传上来的状态
    let right = dfs(n.right)

用三个数字来表示每个节点的状态:

  • 0:该节点无覆盖
  • 1:本节点有摄像头
  • 2:本节点有覆盖

  • 情况1:左右节点都有覆盖 ——> 本节点无覆盖
if(left === 2 && right === 2){
      return 0
    }
  • 情况2:左右节点至少有一个无覆盖的情况 ——> 本节点有摄像头
if(left === 0 || right === 0){
      res ++
      return 1
    }
  • 情况3:左右节点至少有一个有摄像头 ——> 本节点有覆盖
if(left === 1 || right === 1){
      return 2
    }

特殊情况: 最后遍历到根节点如果是无覆盖,则根节点需要转换为有摄像头

if(dfs(root) === 0){ // 处理最后的根节点
    res ++
  }

完整JS代码:

var minCameraCover = function(root) {
  let res = 0
  function dfs(n){
    if(n === null){
      return 2
    }
    
    // 后序遍历,从下往上传递状态
    let left = dfs(n.left)     // 获取传上来的状态
    let right = dfs(n.right)

    if(left === 2 && right === 2){
      return 0
    }
    if(left === 0 || right === 0){
      res ++
      return 1
    }
    if(left === 1 || right === 1){
      return 2
    }

    return -1
  }

  if(dfs(root) === 0){ // 处理最后的根节点
    res ++
  }

  return res
};

相关推荐

  1. LeetCode 968.监控 (hard)

    2024-05-26 06:50:37       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-26 06:50:37       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-26 06:50:37       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-26 06:50:37       82 阅读
  4. Python语言-面向对象

    2024-05-26 06:50:37       91 阅读

热门阅读

  1. leetcode热题100.完全平方数(动态规划进阶)

    2024-05-26 06:50:37       47 阅读
  2. leetcode328-Odd Even Linked List

    2024-05-26 06:50:37       49 阅读
  3. C 语言设计模式(结构型)

    2024-05-26 06:50:37       44 阅读
  4. v-if 与 v-show(vue3条件渲染)

    2024-05-26 06:50:37       50 阅读
  5. kafka防止消息丢失配置

    2024-05-26 06:50:37       48 阅读
  6. Git 基础使用(4)标签管理

    2024-05-26 06:50:37       38 阅读
  7. Python库之lxml的简介、安装、使用方法详细攻略

    2024-05-26 06:50:37       40 阅读
  8. [AIGC] CompletableFuture如何实现任务链式调用?

    2024-05-26 06:50:37       35 阅读
  9. HLS入门

    HLS入门

    2024-05-26 06:50:37      36 阅读