สมมติว่าเรามีต้นไม้ไบนารี เราวางกล้องไว้ที่โหนดของต้นไม้ ตอนนี้กล้องแต่ละตัวที่โหนดสามารถตรวจสอบพาเรนต์ ตัวเอง และลูกของมันได้ เราต้องหาจำนวนกล้องขั้นต่ำที่จำเป็นในการตรวจสอบโหนดทั้งหมดของทรี
ดังนั้นหากอินพุตเป็นเช่น −

แล้วเอาท์พุตจะเป็น 1 เพราะกล้องตัวเดียวก็เพียงพอที่จะติดตามได้ทั้งหมด
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งชุดที่เรียกว่าครอบคลุม ประเภท TreeNode (โหนดทรีมีซ้าย ขวา และฟิลด์ข้อมูล)
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้โหนด พาเรนต์
-
ถ้าโหนดเป็นโมฆะ −
-
กลับ
-
-
แก้ (ด้านซ้ายของโหนด, โหนด)
-
แก้ (ด้านขวาของโหนด โหนด)
-
ถ้า (พาเรนต์เหมือนกับ NULL และ (โหนด ด้านซ้ายของโหนด ด้านขวาของโหนด) ไม่มีอะไรครอบคลุม −
-
(เพิ่มขึ้นทีละ 1)
-
แทรกโหนดเข้าปกคลุม
-
แทรกด้านซ้ายของโหนดลงในส่วนปกคลุม
-
แทรกทางขวาของโหนดในที่กำบัง
-
ใส่พาเรนต์เข้าไป
-
-
จากวิธีหลักให้ทำดังนี้
-
ตอบ :=0
-
แทรก NULL ลงในส่วนปกคลุม
-
แก้ (รูท, NULL)
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = NULL;
right = NULL;
}
};
class Solution {
public:
set<TreeNode*> covered;
int ans;
int minCameraCover(TreeNode* root){
covered.clear();
ans = 0;
covered.insert(NULL);
solve(root, NULL);
return ans;
}
void solve(TreeNode* node, TreeNode* parent){
if (!node)
return;
solve(node->left, node);
solve(node->right, node);
if ((parent == NULL && covered.find(node) == covered.end())
|| covered.find(node->left) == covered.end() || covered.find(node-
>right) == covered.end()) {
ans++;
covered.insert(node);
covered.insert(node->left);
covered.insert(node->right);
covered.insert(parent);
}
}
};
main(){
Solution ob;
TreeNode *root = new TreeNode(1);
root->left = new TreeNode(1);
root->left->left = new TreeNode(1); root->left->right = new
TreeNode(1);
cout << (ob.minCameraCover(root));
} อินพุต
[1,1,NULL,1,1]
ผลลัพธ์
1