समस्या कथन
एन तत्वों की एक सरणी और दो पूर्णांक ए, बी को देखते हुए जो दिए गए सरणी से संबंधित है। एआर [0] से एआर [एन -1] तक तत्व डालने से बाइनरी सर्च ट्री बनाएं। कार्य A से B तक के पथ में अधिकतम तत्व को खोजना है।
उदाहरण
यदि सरणी {24, 23, 15, 36, 19, 41, 25, 35} है तो हम निम्न प्रकार से BST बना सकते हैं -
अगर हम ए =19 और बी =41 पर विचार करें तो इन दोनों नोड्स के बीच अधिकतम तत्व 41 है
एल्गोरिदम
- नोड ए और बी के सबसे कम सामान्य पूर्वज (एलसीए) खोजें।
- एलसीए और ए के बीच अधिकतम नोड खोजें। आइए हम इसे अधिकतम 1 कहते हैं
- एलसीए और बी के बीच अधिकतम नोड खोजें। आइए इसे अधिकतम 2 कहते हैं
- अधिकतम1 और अधिकतम2 लौटाएं
उदाहरण
आइए अब एक उदाहरण देखें -
#include <bits/stdc++.h> using namespace std; struct node { int data; struct node* left; struct node* right; }; node *createNode(int x) { node *p = new node(); p -> data = x; p -> left = NULL; p -> right = NULL; return p; } void insertNode(struct node *root, int x) { node *p = root, *q = NULL; while (p != NULL) { q = p; if (p -> data < x) { p = p -> right; } else { p = p -> left; } } if (q == NULL) { p = createNode(x); } else { if (q -> data < x) { q -> right = createNode(x); } else { q -> left = createNode(x); } } } int maxelpath(node *q, int x) { node *p = q; int mx = INT_MIN; while (p -> data != x) { if (p -> data > x) { mx = max(mx, p -> data); p = p -> left; } else { mx = max(mx, p -> data); p = p -> right; } } return max(mx, x); } int getMaximumElement(struct node *root, int x, int y) { node *p = root; while ((x < p -> data && y < p -> data) || (x > p -> data && y > p -> data)) { if (x < p -> data && y < p -> data) { p = p -> left; } else if (x > p -> data && y > p -> data) { p = p -> right; } } return max(maxelpath(p, x), maxelpath(p, y)); } int main() { int arr[] = {24, 23, 15, 36, 19, 41, 25, 35}; int a = 19, b = 41; int n = sizeof(arr) / sizeof(arr[0]); struct node *root = createNode(arr[0]); for (int i = 1; i < n; i++) insertNode(root, arr[i]); cout << "Maximum element = " << getMaximumElement(root, a, b) << endl; return 0; }
आउटपुट
Maximum element = 41