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

พื้นและเพดานจาก BST ใน C++


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

  • รูตคือกุญแจสำคัญ จากนั้นค่ารูทคือค่าเพดาน
  • หากคีย์ข้อมูลรูท <ค่าเพดานจะไม่อยู่ที่ทรีย่อยด้านซ้าย จากนั้นไปที่ทรีย่อยทางขวา และลดโดเมนของปัญหา
  • หากคีย์ข้อมูลรูท> ค่าเพดานอาจอยู่ที่ทรีย่อยทางขวา เราอาจพบโหนดที่มีข้อมูลมากกว่าคีย์ในทรีย่อยทางซ้าย หากไม่มีองค์ประกอบดังกล่าว รูทจะเป็นค่าเพดาน

สมมุติว่าต้นไม้เป็นแบบนี้ −

พื้นและเพดานจาก BST ใน C++

เพดาน 0, 1, 2 คือ 2, เพดาน 3, 4 คือ 4 เป็นต้น

ที่นี่เราจะเห็นฟังก์ชันเพดานเท่านั้น หากเราปรับเปลี่ยนเล็กน้อยนี้ เราจะได้ค่าพื้น

ตัวอย่าง

#include <iostream>
using namespace std;
class node {
   public:
   int key;
   node* left;
   node* right;
};
node* getNode(int key) {
   node* newNode = new node();
   newNode->key = key;
   newNode->left = NULL;
   newNode->right = NULL;
   return newNode;
}
int ceiling(node* root, int num) {
   if (root == NULL)
   return -1;
   if (root->key == num)
      return root->key;
   if (root->key < num)
      return ceiling(root->right, num);
   int ceil = ceiling(root->left, num);
   return (ceil >= num) ? ceil : root->key;
}
int main() {
   node* root = getNode(8);
   root->left = getNode(4);
   root->right = getNode(12);
   root->left->left = getNode(2);
   root->left->right = getNode(6);
   root->right->left = getNode(10);
   root->right->right = getNode(14);
   for (int i = 0; i < 16; i++)
   cout << i << "\tCeiling: " << ceiling(root, i) << endl;
}

ผลลัพธ์

0 Ceiling: 2
1 Ceiling: 2
2 Ceiling: 2
3 Ceiling: 4
4 Ceiling: 4
5 Ceiling: 6
6 Ceiling: 6
7 Ceiling: 8
8 Ceiling: 8
9 Ceiling: 10
10 Ceiling: 10
11 Ceiling: 12
12 Ceiling: 12
13 Ceiling: 14
14 Ceiling: 14
15 Ceiling: -1