ในปัญหานี้ เราได้รับสองค่า k1 และ k2 (k1
คำอธิบายปัญหา: เราจะพิมพ์คีย์ทั้งหมดของต้นไม้ตั้งแต่ n1 ถึง n2 ตามลำดับที่เพิ่มขึ้น
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล:
k1 =4, k2 =12
ผลลัพธ์: 6, 7, 9
แนวทางการแก้ปัญหา
ง่าย เราสามารถแก้ปัญหาโดยใช้ การข้ามผ่าน แต่ความซับซ้อนของพื้นที่มี 0(n) แต่ความต้องการของชั่วโมงคือการแก้ในความซับซ้อน O(1) สำหรับสิ่งนี้ เราจะใช้เทคนิคการข้ามผ่านแบบพิเศษ
เราจะใช้ Morris Traversal ซึ่งขึ้นอยู่กับต้นไม้ไบนารีแบบเธรด ไม่ต้องใช้สแต็ก/คิวใดๆ และใช้พอยน์เตอร์ NULL เพื่อจัดเก็บข้อมูล ซึ่งช่วยลดพื้นที่จัดเก็บเป็น O(1)
โปรแกรมแสดงการทำงานของมอร์ริสทราเวอร์แซลเพื่อแก้ปัญหา
ตัวอย่าง
#include <iostream>
using namespace std;
struct node {
int data;
struct node *left, *right;
};
node* insertNode(int data) {
node* temp = new node;
temp->data = data;
temp->right = temp->left = NULL;
return temp;
}
void RangeTraversal(node* root, int k1, int k2) {
if (!root)
return;
node* nodeTraversal = root;
while (nodeTraversal) {
if (nodeTraversal->left == NULL) {
if (nodeTraversal->data <= k2 && nodeTraversal->data >= k1)
cout<<nodeTraversal->data<<" ";
nodeTraversal = nodeTraversal->right;
}
else {
node* prevNode = nodeTraversal->left;
while (prevNode->right != NULL && prevNode->right != nodeTraversal)
prevNode = prevNode->right;
if (prevNode->right == NULL) {
prevNode->right = nodeTraversal;
nodeTraversal = nodeTraversal->left;
}
else {
prevNode->right = NULL;
if (nodeTraversal->data <= k2 && nodeTraversal->data >= k1)
cout<<nodeTraversal->data<<" ";
nodeTraversal = nodeTraversal->right;
}
}
}
}
int main() {
node* root = insertNode(6);
root->left = insertNode(3);
root->right = insertNode(2);
root->left->left = insertNode(1);
root->left->right = insertNode(7);
root->right->right = insertNode(9);
cout<<"All BST keys in the given range are \t";
RangeTraversal(root, 4, 10);
return 0;
} ผลลัพธ์
All BST keys in the given range are 7 6 9