贪心二叉树

968.监控二叉树

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

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

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

错误归纳:

局部变量遮蔽问题:在 minCameraCover 函数中,声明一个局部变量 result 并初始化为 0。这会遮蔽类中的成员变量 result,导致成员变量的值不会被递归函数 traversal 所改变。

class Solution {
private:
    int result; // 成员变量用于记录摄像头数量

    int traversal(TreeNode* cur) {
        if (!cur) return 2; // 空节点返回2

        int left = traversal(cur->left);
        int right = traversal(cur->right);

        // 如果左右子节点都被覆盖,当前节点也被视为被覆盖
        if (left == 2 && right == 2) {
            return 2;
        }

        // 如果当前节点至少有一个未被覆盖的子节点,且另一个子节点不是摄像头
        if ((left == 0 && right != 1) || (right == 0 && left != 1)) {
            result++; // 增加摄像头数量
            return 1; // 当前节点有摄像头
        }

        // 如果当前节点的子节点之一有摄像头,且另一个子节点被覆盖或也是摄像头
        if (left == 1 || right == 1) {
            return 2; // 当前节点被覆盖
        }

        // 其他情况,当前节点无覆盖
        return 0;
    }

public:
    Solution() : result(0) {} // 构造函数初始化result

    int minCameraCover(TreeNode* root) {
        return result = (traversal(root) == 1) ? result + 1 : result; // 根据root的覆盖情况更新result
    }
};

traversal 函数通过递归遍历二叉树的每个节点,根据其左右子节点的状态来决定当前节点是否需要放置摄像头。

状态的传递:在递归过程中,每个节点的状态(是否需要摄像头、是否被覆盖)被传递给其父节点。这种状态传递是通过返回值实现的,从而影响父节点的决策。

决策的局部性:每次决策(放置摄像头与否)都是基于当前节点及其子节点的局部信息,而不是整个树的全局信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值