leetcode968. 监控二叉树(java)

很多题解说用动态规划

但我觉得可以用后续遍历

但是不会实习 感谢题解

class Solution {
    private int ans = 0;
    public int minCameraCover(TreeNode root) {
        ans = 0;
        if(afternoon(root) == 2) ans++;
        return ans;
    }

    public int afternoon(TreeNode root){
        if( root == null ) return 1;
        int left = afternoon(root.left);
        int right = afternoon(root.right);
        if(left == 1 && right == 1) return 2;
        if(left == 2 || right == 2){
            ans ++;
            return 0;
        }
        if(left == 0 || right == 0) return 1;
        return -1;
    }
}


有注释版本链接:https://leetcode.cn/problems/binary-tree-cameras/solution/by-fire_in_winter-tu3o/ 

class Solution {
    private int count;
    public int minCameraCover(TreeNode root) {
        count = 0;
        //最后我们对根节点进行处理,若是根节点并未被其子节点覆盖到,那就应该在根节点放一个摄像头
        if(travel(root)==2)
            count++;
        return count;
    }

    //子树的状态有三种,0,1,2。0表示的是有摄像头,1表示的是有覆盖,2表示的是没有覆盖
    private int travel(TreeNode root){
        // 递归的基线情况
        //空节点:设置状态为被摄像头覆盖
        if(root==null)
            return 1;
        //查看左子树和右子树的状态,以用于确定本节点的状态
        int left = travel(root.left);
        int right = travel(root.right);
        //如果左子树和右子树均只是被覆盖,那么本节点就应设置为未被覆盖,情况5
        if(left==1&&right==1){
            return 2;
        }
        //至少有一个子树的状态是未被覆盖,那么无论如何都应该在本节点设置摄像头
        //这里包含的情况 9、8、7、6、3
        if(left==2||right==2){
            count++;
            return 0;
        }
        //这里是左子树、右子树均被覆盖的基础上,有一个有摄像头或者全有摄像头
        //包含1,、2、4
        if(left==0||right==0){
            return 1;
        }
        //所有可能在上面已全部被写到,这里是不可能被执行的
        return -1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值