当前位置:   article > 正文

Leetcode 968 监控二叉树

Leetcode 968 监控二叉树

理解题意

        给定一个二叉树,我们在树的节点上安装摄像头。
        节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
        计算监控树的所有节点所需的最小摄像头数量。

        什么是监控?

        

        目标:最少的摄像头数目监控所有节点。

解题思路

        采用贪心的思路来解题。首先明确局部最优解和全局最优解。

        全局最优解:最少的摄像头监控所有节点

        局部最优解:尽可能用中间的节点来监控周围节点,来达到较少摄像头的目的。——即摄像头放在叶子节点,只能覆盖其父节点。而摄像头放根节点,只能覆盖左右孩子,但是中间节点至少可以覆盖:父节点+左右孩子,三个节点。

        两端的节点主要是最上面的跟节点和最下面的叶子节点。

        根节点只有一个,所以尽可能从叶子节点上节省摄像头。在一条链路上,两个摄像头之间可以间隔两个节点。一个覆盖节点和摄像头间隔一个节点。

        分情况讨论:节点的状态分为:0未覆盖、1摄像头、2已覆盖

        注意:null节点的状态应为2.

        

        1.左孩子|右孩子有一个0状态,则父节点一定要设置摄像头(状态1)来保证全覆盖。

        2.左右孩子没有0状态,且左右孩子有一个摄像头,则父节点状态一定为覆盖(状态2)

        3.左右孩子都是已覆盖状态,则当前节点的父节点一定有一个摄像头(状态1),来保证覆盖当前节点(状态2)的同时覆盖更多的情感。

        从叶子节点开始遍历各个节点的状态,并统计摄像头的个数。

        其中总是通过左右孩子确定当前节点,则采用后续遍历:左右中

        

特别注意:

        根节点左孩子被覆盖,按照规律若根节点有父节点应在其父节点上设置摄像头,但是根节点没有父节点,所以导致最终结束遍历时,根节点未覆盖(状态1)

        所以遍历结束后应判断根节点是否为0状态,是则需要在根节点再设置一个摄像头。摄像头数目+1.

        

        

1.贪心解题

  1. int count=0;
  2. public int minCameraCover(TreeNode root) {
  3. int result=traversal(root);
  4. if(result==0) count++;
  5. return count;
  6. }
  7. //总是返回节点状态
  8. int traversal(TreeNode root){
  9. if(root==null) return 2;
  10. //后续遍历
  11. int left=traversal(root.left);
  12. int right=traversal(root.right);
  13. //中间状态
  14. if(left==0||right==0){
  15. count++;
  16. return 1;
  17. }
  18. if(left==1||right==1) return 2;
  19. if(left==2&&right==2) return 0;
  20. return -1;
  21. }

2.分析

时间复杂度:O(n) 遍历所有节点

空间复杂度:O(n) 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/84968
推荐阅读
相关标签
  

闽ICP备14008679号