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

BST ที่ใหญ่ที่สุดใน Binary Tree ใน C ++


ในไบนารีทรี มีเพียงสองโหนด (ซ้ายและขวา) ในแต่ละโหนดย่อย โครงสร้างแบบต้นไม้เป็นเพียงการแสดงข้อมูล Binary Search Trees (BST) เป็น Binary Tree ชนิดพิเศษที่ตรงตามเงื่อนไขเหล่านี้ -

  • เมื่อเปรียบเทียบกับพาเรนต์ โหนดย่อยด้านซ้ายมีขนาดเล็กกว่า

  • โหนดแม่ของลูกด้านขวามีขนาดใหญ่กว่าโหนดลูก

สมมติว่าเราได้รับไบนารีทรี และเราควรจะค้นหาว่าอะไรคือโครงสร้างการค้นหาไบนารีที่ใหญ่ที่สุด (BST) ภายในนั้น

ในงานนี้ เราจะสร้างฟังก์ชันเพื่อค้นหา BST ที่ใหญ่ที่สุดในไบนารีทรี เมื่อไบนารีทรีเป็นตัว BST เป็นไปได้ที่จะกำหนดขนาดของไบนารีทรีทั้งหมด ยกตัวอย่าง −

ป้อนข้อมูล

      10
      /\
    5    15
   /\ \
1 8 7

ดังที่แสดง แผนผังย่อยของ BST ที่เน้น ในกรณีนี้ ใหญ่ที่สุด '3' คือขนาดของทรีย่อย ดังนั้นค่าที่ส่งคืนคือขนาดของทรีย่อย

ป้อนข้อมูล

52
/ \
37 67
/\ / \
12 27 57 77
/\
72 87

ผลผลิต

5

ทรีย่อยที่มีโหนดที่มีความยาวน้อยกว่าความยาวของโหนดหลักจะมีโหนด BST สูงสุดสามขนาด

แนวทางในการค้นหา BST ที่ใหญ่ที่สุดในแผนภูมิไบนารีที่กำหนด

สำหรับทุกโหนด x ต้นไม้ไบนารีคือ BST หากจุดต่อไปนี้ถูกต้อง เฉพาะโหนดที่มีข้อมูลน้อยกว่าโหนดหลักเท่านั้นที่จะปรากฏในทรีย่อยด้านซ้ายของโหนด มีได้เพียงโหนดเดียวเท่านั้นที่มีข้อมูลมากกว่าโหนดหลัก ต้นไม้ย่อยทั้งซ้ายและขวาควรมีลักษณะเป็นต้นไม้การค้นหาแบบไบนารี (BST)

อัลกอริทึมจะเป็น −

เราจะเริ่มจากรูทของไบนารีทรีและทำการข้ามผ่านตามลำดับโดยใช้การเรียกซ้ำ สำหรับโหนดปัจจุบัน 'ROOT' เราจะทำสิ่งต่อไปนี้-

  • หากเป็นรูทของ BST ที่ถูกต้อง เราจะคืนค่าขนาด

  • มิฉะนั้น เราจะพบ BST ที่ใหญ่ที่สุดในทรีย่อยด้านซ้ายและขวา

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node *left;
   struct Node *right;
};
struct Node *
newNode (int data) {
   struct Node *node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
struct Detail {
   int size;
   int max;
   int min;
   int ans;
   bool isBST;
};
bool isBST (Node * root, int min, int max) {
   if (root == NULL) {
      return true;
   }
   if (root->data < min || root->data > max) {
      return false;
   }
   return isBST (root->left, min, root->data - 1) &&
   isBST (root->right, root->data + 1, max);
}
int size (Node * root) {
   if (root == NULL) {
      return 0;
   }
   return 1 + size (root->left) + size (root->right);
}
int largestBST (Node * root) {
   // Current Subtree is BST.
   if (isBST (root, INT_MIN, INT_MAX) == true) {
      return size (root);
   }
   // Find largest BST in left and right subtrees.
   return max (largestBST (root->left), largestBST (root->right));
}
int main () {
   struct Node *root = newNode (67);
   root->left = newNode (72);
   root->right = newNode (77); root->left->left = newNode (57);
   printf ("Size of the largest BST is %d", largestBST (root));
   return 0;
}

ผลลัพธ์

Size of the largest BST is 2

บทสรุป

ในปัญหานี้ เราได้เรียนรู้ว่าไบนารีทรีและทรีการค้นหาแบบไบนารีคืออะไร และวิธีค้นหา BST ที่ใหญ่ที่สุดในแผนผังไบนารีที่กำหนดโดยใช้การเรียกซ้ำ ด้วยความช่วยเหลือของการเรียกซ้ำ เราจะค้นหาว่าทรีย่อยภายใต้ทุกโหนดเป็น BST หรือไม่ และคืนค่าตามนั้น