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
函数通过递归遍历二叉树的每个节点,根据其左右子节点的状态来决定当前节点是否需要放置摄像头。
状态的传递:在递归过程中,每个节点的状态(是否需要摄像头、是否被覆盖)被传递给其父节点。这种状态传递是通过返回值实现的,从而影响父节点的决策。
决策的局部性:每次决策(放置摄像头与否)都是基于当前节点及其子节点的局部信息,而不是整个树的全局信息。