#include <bits/stdc++.h>
using namespace std;
struct Node{
int val;
Node *left;
Node *right;
Node(int x)
{
val = x;
left = nullptr;
right = nullptr;
}
};
int minCameras(Node* root, int& cameras)
{
if (root == nullptr) {
return 1;
}
int left_state = minCameras(root->left, cameras);
int right_state = minCameras(root->right, cameras);
// Trường hợp 1: Cả hai con đều đã được bao phủ
if (left_state == 1 && right_state == 1) {
return 0; // Node hiện tại chưa được bao phủ và không có camera
}
// Trường hợp 2: Ít nhất một trong hai con chưa được bao phủ
if (left_state == 0 || right_state == 0) {
cameras++; // Đặt một camera tại node hiện tại để bao phủ nó và các con
return 2;
}
// Trường hợp 3: Ít nhất một trong hai con có camera
if (left_state == 2 || right_state == 2) {
return 1; // Node hiện tại đã được bao phủ bởi camera của con
}
// Trường hợp mặc định (không nên xảy ra nếu logic đúng)
return -1;
}
int minCameraCover(Node* root) {
int cameras = 0;
if (minCameras(root, cameras) == 0) {
cameras++;
// Nếu root chưa được bao phủ sau khi duyệt, cần đặt một camera tại root
}
return cameras;
}
int main() {
// Xây dựng một cây nhị phân ví dụ
Node* root = new Node(0);
root->left = new Node(0);
root->left->left = new Node(0);
root->left->right = new Node(0);
root->right = new Node(0);
root->right->right = new Node(0);
cout << "So camera toi thieu: " << minCameraCover(root) << endl; // Output: 2
// Xây dựng một cây nhị phân ví dụ khác
Node* root2 = new Node(0);
root2->left = new Node(0);
root2->left->left = new Node(0);
root2->left->left->left = new Node(0);
root2->left->left->left->right = new Node(0);
cout << "So camera toi thieu: " << minCameraCover(root2) << endl; // Output: 2
return 0;
}