最少相机覆盖二叉树
给定一棵二叉树的头节点head,如果在某一个节点x上放置相机,那么x的父节点、x的所 有子节点以及x都可以被覆盖。返回如果要把所有数都覆盖,至少需要多少个相机。
public class Main {
public static class Node {
public Node left;
public Node right;
}
enum CameraState {
/**
* 有相机
*/
HAS,
/**
* 无相机但是覆盖
*/
COVERD,
/**
* 无相机且无覆盖
*/
NOT_COVERD
}
public static class Info {
CameraState cameraState;
int need;
public Info(CameraState cameraState, int need) {
this.cameraState = cameraState;
this.need = need;
}
}
private static Info solve(Node root) {
if (root == null) {
return new Info(CameraState.COVERD, 0);
}
Info left = solve(root.left);
Info right = solve(root.right);
if (CameraState.HAS.equals(left.cameraState) || CameraState.HAS.equals(right.cameraState)) {
return new Info(CameraState.COVERD, left.need + right.need);
}
if (CameraState.NOT_COVERD.equals(left.cameraState) || CameraState.NOT_COVERD.equals(right.cameraState)) {
return new Info(CameraState.HAS, left.need + right.need + 1);
}
return new Info(CameraState.NOT_COVERD, left.need + right.need);
}
public static int minCamera(Node root) {
if (root == null) {
return 0;
}
Info info = solve(root);
int need = info.need;
if (CameraState.NOT_COVERD.equals(info.cameraState)) {
need++;
}
return need;
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号