इस समस्या में हमें एक बाइनरी ट्री दिया जाता है और बाइनरी ट्री के दो नोड परिभाषित किए जाते हैं। और हमें नोड के सभी सामान्य पूर्वजों यानी सामान्य नोड्स को प्रिंट करना होगा जो ट्रैवर्सल से नोड तक के पथ में होते हैं।
बाइनरी ट्री एक विशेष वृक्ष है जिसके प्रत्येक नोड में अधिकतम दो बच्चे नोड होते हैं। इसलिए, प्रत्येक नोड या तो लीफ नोड होता है या उसमें एक या दो चाइल्ड नोड होते हैं।
उदाहरण,
पूर्वज नोड एक नोड है जो एक पेड़ में निचले स्तर के नोड्स से जुड़ा होता है।
सामान्य पूर्वज नोड दो नोड्स का एक नोड है जो एक पेड़ में दोनों नोड्स का पूर्वज नोड है।
उदाहरण के लिए -
उपरोक्त बाइनरी ट्री में, हमें 0 और 6 के उभयनिष्ठ पूर्वज का पता लगाना है।
आउटपुट -3, 2
अब, इस समस्या के आधार पर, इस समस्या को हल करने के लिए एक एल्गोरिथम बनाते हैं,
एल्गोरिदम
Step 1 : Find the lowest common ancestor of the two nodes of the given tree. And print it. Step 2 : Traverse upward to the root node and print all the nodes that come in the path.
उदाहरण
अब, इस समस्या के समाधान को दर्शाने के लिए एक प्रोग्राम बनाते हैं,
#include <iostream> using namespace std; struct Node { struct Node* left, *right; int key; }; Node* insertNode(int key){ Node* temp = new Node; temp->key = key; temp->left = temp->right = NULL; return temp; } struct Node* LowestCommonAncestors(struct Node* root, int n1, int n2){ if (root == NULL) return NULL; if (root->key == n1 || root->key == n2) return root; Node* left_lca = LowestCommonAncestors(root->left, n1, n2); Node* right_lca = LowestCommonAncestors(root->right, n1, n2); if (left_lca && right_lca) return root; return (left_lca != NULL) ? left_lca : right_lca; } bool printAncestorNodes(struct Node* root, int target){ if (root == NULL) return false; if (root->key == target) { cout << root->key << "\t"; return true; } if (printAncestorNodes(root->left, target) || printAncestorNodes(root->right, target)) { cout << root->key << "\t”; return true; } return false; } bool printcommonAncestors(struct Node* root, int first, int second){ struct Node* LCA = LowestCommonAncestors(root, first, second); if (LCA == NULL) return false; printAncestorNodes(root, LCA->key); } int main(){ Node* root = insertNode(24); root->left = insertNode(8); root->right = insertNode(69); root->left->left = insertNode(12); root->left->right = insertNode(41); root->right->left = insertNode(50); root->right->right = insertNode(3); root->left->left->left = insertNode(22); root->right->left->left = insertNode(10); root->right->left->right = insertNode(6); if (printcommonAncestors(root, 6, 3) == false) cout << "No Common nodes"; return 0; }
आउटपुट
69 24