Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

กล้องต้นไม้ไบนารีใน C ++


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

ดังนั้นหากอินพุตเป็นเช่น −

กล้องต้นไม้ไบนารีใน C ++

แล้วเอาท์พุตจะเป็น 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