力扣968题(监控二叉树)

968、监控二叉树

基本思想:

贪心

具体实现:

从下往上看,

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

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

确定遍历顺序:后序遍历

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

  0.本节点无覆盖

  1.本节点有摄像头

  2.本节点有覆盖

  空节点的状态是有覆盖

递归终止条件:遇到空节点,并返回2(有覆盖)

单层逻辑:

1.左右节点都有覆盖,当前节点就无覆盖,返回0,不需要放摄像头

2.左右节点至少一个无覆盖,当前节点需要放摄像头,返回1,并result++

3.左右节点至少一个有摄像头,当前节点覆盖了,返回2

 这个图中先判断情况2,在判断情况3

4.头结点没有覆盖,直接result++

代码:

class Solution {
    private int count = 0;
    public int minCameraCover(TreeNode root) {
        if (trval(root) == 0) count++;//情况4
        return count;
    }
    private int trval(TreeNode root){
        if (root == null) return 2;//空节点,该节点有覆盖
        
        int left = trval(root.left);
        int right = trval(root.right);

        if (left == 2 && right == 2){// 情况1
            return 0;
        }else if(left == 0 || right == 0){//情况2
            count++;
            return 1;
        }else{
            return 2;//情况3
        } 
    }
}
原文地址:https://www.cnblogs.com/zhaojiayu/p/15463763.html