เราได้รับต้นไม้การค้นหาไบนารีเป็นอินพุต เป้าหมายคือการค้นหาจำนวนทรีย่อยใน BST ซึ่งมีค่าโหนดอยู่ระหว่างช่วงเริ่มต้นและสิ้นสุด หากเริ่มต้นคือ 5 และสิ้นสุดคือ 50 จากนั้นนับทรีย่อยใน BST ที่โหนดทั้งหมดมีน้ำหนัก>=5 และ <=50
ป้อนข้อมูล − ต้นไม้ที่ระบุด้านล่าง − ช่วง [ 3-6 ]
ผลผลิต − จำนวนต้นไม้ที่อยู่ในระยะ − 2
คำอธิบาย - สำหรับโหนด 4 และ 6 เท่านั้น แผนผังย่อย ( NULL ) อยู่ระหว่าง 3-6
ป้อนข้อมูล − ต้นไม้ที่ระบุด้านล่าง:ช่วง [ 12-20 ]
ผลผลิต − จำนวนต้นไม้ที่อยู่ในระยะ − 3
คำอธิบาย − สำหรับโหนด 16, 14 และ 20 แผนผังย่อยอยู่ระหว่าง 12-20
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
โครงสร้าง Btreenode ใช้เพื่อสร้างโหนดของทรี โดยมีส่วนข้อมูลเป็นจำนวนเต็มและตัวชี้อ้างอิงซ้ายและขวาเพื่อชี้ไปยังทรีย่อย
-
ฟังก์ชัน Btreenode* insert(int data) ใช้เพื่อสร้างโหนดที่มีข้อมูลเป็นข้อมูลและตัวชี้ซ้ายและขวาเป็น NULL
-
สร้าง BST โดยใช้ฟังก์ชันแทรกโดยเรียกใช้โครงสร้างที่กำหนด วิธีเพิ่มโหนดทางขวาให้กับโหนดรูท ( root->right =insert(70); ) และทางซ้ายของรูท ( root->left =insert(30); )
-
ตัวแปร l และ h ใช้เพื่อเก็บค่าต่ำสุดและสูงสุดของช่วง
-
การนับตัวแปรจะเก็บการนับของ BST ภายในต้นไม้ที่อยู่ในช่วงระหว่าง l และชั่วโมง เริ่มแรก 0.
-
ฟังก์ชัน getBtreeCount(รูท Btreenode*, int low, int high, int* count) รับรูทของ BST ขอบเขตด้านซ้ายและขวาของช่วงและที่อยู่ของการนับเป็นพารามิเตอร์ และอัปเดตค่าของการนับสำหรับการเรียกซ้ำแต่ละครั้ง
-
สำหรับการตรวจสอบรูทปัจจุบันว่าเป็น NULL ถ้าใช่ ให้คืนค่า 1 เนื่องจากไม่ใช่ส่วนหนึ่งของทรี
-
สำหรับโหนดปัจจุบัน ให้ตรวจสอบว่าโหนดทรีย่อยด้านซ้ายและขวาทั้งหมดอยู่ในช่วงที่กำหนดหรือไม่ โดยการเรียกซ้ำ getBtreeCount(root->left, low, high, count); andgetBtreeCount(root->ขวา ต่ำ สูง นับ);
-
หากทรีย่อยทั้งสองอยู่ระหว่างช่วงและโหนดปัจจุบันยังอยู่ในช่วงนั้น ต้นไม้ที่รูทที่โหนดปัจจุบันจะอยู่ในช่วง นับเพิ่ม. ถ้า (left &&right &&root->info>=low &&root->info <=high) และ ++*count; กลับ 1.
-
เมื่อสิ้นสุดการนับจะมีการอัปเดตค่าเป็นจำนวนทรีย่อยทั้งหมด
- พิมพ์ผลลัพธ์เป็นจำนวน
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; // A BST node struct Btreenode { int info; Btreenode *left, *right; }; int getBtreeCount(Btreenode* root, int low, int high, int* count){ // Base case if (root == NULL) return 1; int left = getBtreeCount(root->left, low, high, count); int right = getBtreeCount(root->right, low, high, count); if (left && right && root->info >= low && root->info <= high) { ++*count; return 1; } return 0; } Btreenode* insert(int data){ Btreenode* temp = new Btreenode; temp->info = data; temp->left = temp->right = NULL; return (temp); } int main(){ /* BST for input 50 / \ 30 70 / \ / \ 20 40 60 80 */ Btreenode* root = insert(50); root->left = insert(30); root->right = insert(70); root->left->left = insert(20); root->left->right= insert(40); root->right->left = insert(60); root->right->right = insert(80); int l = 10; int h = 50; int count=0; getBtreeCount(root, l, h, &count); cout << "Count of subtrees lying in range: " <<count; return 0; }
ผลลัพธ์
Count of subtrees lying in range: 3