题目

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

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

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

思路

后序遍历,根据子节点的状态设置父节点的状态。若任一子节点未被监视,父节点则需安装摄像头;若任一子节点已安装摄像头,则父节点已被监视且无需安装;否则(子节点被子节点的子节点监视)返回其需要被监视。

代码

    int res = 0;

    public int minCameraCover(TreeNode root) {
        if (root == null) return 0;
        if (dfs(root) == -1)
            res++;
        return res;
    }

    // 1:该节点安装了摄像头
    // -1:未被监视
    // 0:被监视或为空
    private int dfs(TreeNode node) {
        if (node == null)
            return 0;
        int left = dfs(node.left);
        int right = dfs(node.right);
        if (left == -1 || right == -1) {
            res++;
            return 1;
        }
        if (left == 1 || right == 1)
            return 0;
        return -1;
    }