方法一:递归
// 0:该节点安装了监视器 1:该节点可观,但没有安装监视器 2:该节点不可观 int monitor = 0; int state(TreeNode* node) { if (node == nullptr) return 1; int left = state(node->left); int right = state(node->right); // 该节点为0的情况 if (left == 2 || right == 2) { monitor++; // 由于左或右节点不可观,则需要给当前节点安装监视器,为0状态 return 0; } // 为1的情况 else if (left == 0 || right == 0) return 1; // 由于左或右节点安装了监视器,当前节点就不需要安装监视器也可观了,为1状态 // 为2的情况 else // 其他:即为left==1&&right==1,左右节点都可观,但没有监视器,当前节点不可观,为2状态 return 2; } int minCameraCover(TreeNode *root) { if (root == nullptr) return 0; if (state(root) == 2) monitor++; // 如果这个节点为2的状态,需要加一个监视器 return monitor; }
解题思路: 由于叶子节点一定不要安装监视器,这样才能使总监视器数量比较少,因此需要从下往上进行判断当前节点的状态(共:3种状态):
对于叶子节点,我们认为不可观
【leetcode 968. 监控二叉树】解题报告[待完善...]
原文:https://www.cnblogs.com/brianyi/p/10801186.html