最少相机覆盖二叉树

给定一棵二叉树的头节点head,如果在某一个节点x上放置相机,那么x的父节点、x的所 有子节点以及x都可以被覆盖。返回如果要把所有数都覆盖,至少需要多少个相机。

public class Main {
    public static class Node {
        public Node left;
        public Node right;
    }

    enum CameraState {
        /**
         * 有相机
         */
        HAS,
        /**
         * 无相机但是覆盖
         */
        COVERD,
        /**
         * 无相机且无覆盖
         */
        NOT_COVERD
    }

    public static class Info {
        CameraState cameraState;
        int need;

        public Info(CameraState cameraState, int need) {
            this.cameraState = cameraState;
            this.need = need;
        }
    }

    private static Info solve(Node root) {
        if (root == null) {
            return new Info(CameraState.COVERD, 0);
        }
        Info left = solve(root.left);
        Info right = solve(root.right);
        if (CameraState.HAS.equals(left.cameraState) || CameraState.HAS.equals(right.cameraState)) {
            return new Info(CameraState.COVERD, left.need + right.need);
        }
        if (CameraState.NOT_COVERD.equals(left.cameraState) || CameraState.NOT_COVERD.equals(right.cameraState)) {
            return new Info(CameraState.HAS, left.need + right.need + 1);
        }
        return new Info(CameraState.NOT_COVERD, left.need + right.need);
    }

    public static int minCamera(Node root) {
        if (root == null) {
            return 0;
        }
        Info info = solve(root);
        int need = info.need;
        if (CameraState.NOT_COVERD.equals(info.cameraState)) {
            need++;
        }
        return need;
    }
}
posted @ 2021-10-18 21:41  Tianyiya  阅读(83)  评论(0)    收藏  举报