二叉树放置照相机 Binary Tree Cameras

2019-03-27 15:39:37

问题描述:

问题求解:

很有意思的问题,问题描述简单,求解过程也可以非常的简洁,是个难得的好题。

求解的过程是自底向上进行分析,对于叶子节点,如果在叶子上放置照相机,显然是没有在其parent上放置相机来的合适的,因为叶子节点的覆盖范围没有其parent节点大。

因此,我们就可以对所有的叶子的节点的parent进行放置相机,同时将所有已经覆盖掉的节点去除掉。

对于剩下的节点重复上述的操作即可。

这里在求解的时候并不需要真实的去删除节点,只要在每个节点上加上标注信息就可以了。

叶子节点 :1

放置照相机 :2

已经被cover节点 :3

    public int minCameraCover(TreeNode root) {
        int[] res = new int[1];
        int state = helper(root, res);
        if (state == 1) res[0]++;
        return res[0];
    }
    
    // 1 : leaf
    // 2 : camera
    // 3 : covered
    private int helper(TreeNode root, int[] res) {
        if (root == null) return 3;
        int l = helper(root.left, res);
        int r = helper(root.right, res);
        if (l == 3 && r == 3) return 1;
        else if (l == 1 || r == 1) {
            res[0]++;
            return 2;
        }
        else return 3;
    }

  

原文地址:https://www.cnblogs.com/hyserendipity/p/10608049.html