1class Solution {
2 private int cameras = 0;
3
4 public int minCameraCover(TreeNode root) {
5 // States: 0=not covered, 1=covered, 2=has camera
6 if (dfs(root) == 0) {
7 cameras++;
8 }
9 return cameras;
10 }
11
12 private int dfs(TreeNode node) {
13 if (node == null) {
14 return 1; // Null nodes are covered
15 }
16
17 int leftState = dfs(node.left);
18 int rightState = dfs(node.right);
19
20 // If any child is not covered, place camera here
21 if (leftState == 0 || rightState == 0) {
22 cameras++;
23 return 2; // Has camera
24 }
25
26 // If any child has camera, this node is covered
27 if (leftState == 2 || rightState == 2) {
28 return 1; // Covered
29 }
30
31 // Both children covered but no camera - not covered
32 return 0; // Not covered
33 }
34}