Leetcode968. 监控二叉树-代码随想录

目录

题目:

代码(首刷看解析 2024年2月18日):

代码(二刷看解析 2024年6月16日 go)


题目:


代码(首刷看解析 2024年2月18日):

        后序遍历,从叶子节点到根节点状态转移:

                若左右孩子存在摄像头,则返回本节点被监视

                若左右孩子存在未被监视,则返回本节点摄像头,并res++

                若左右孩子都被监视,则返回本节点未被监视

class Solution {
private:
    int res;
    /*0代表未被监视区域,1代表被监视区域,2代表摄像头区域*/
    int DFS(TreeNode* root) {
        if (!root) return 1;

        int left = DFS(root->left);
        int right = DFS(root->right);
        if (left == 0 || right == 0) {
            res++;
            return 2;
        } else if (left == 2 || right == 2) {
            return 1;
        } else if (left == 1 && right == 1) {
            return 0;
        }
        return 10;
    }
public:
    int minCameraCover(TreeNode* root) {
        if (!root) return 0;
        res = 0;
        int _root = DFS(root);
        if (_root == 0) res++;
        return res;
    }
};

代码(二刷看解析 2024年6月16日 go)

看到这个递归函数写在函数内部的写法我都惊了,不知道cpp可以不可以这样写,看的别人的代码。如果可以的话是用lambda表达式吗?

func minCameraCover(root *TreeNode) int {
    res := 0
    var helper func(cur *TreeNode) int
    helper = func(cur *TreeNode) int {
        if cur == nil {
            return 1
        }
        left := helper(cur.Left)
        right := helper(cur.Right)
        // 本层要设置摄像头的情况:左右子树有任1没被覆盖
        if left == 0 || right == 0 {
            res++
            return 2
        }
        // 本层要修改成被覆盖的情况:左右子树存在摄像头
        if left == 2 || right == 2 {
            return 1
        }
        return 0
    }

    if helper(root) == 0 {
        res++
    }
    return res    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值