अवधारणा
किसी दिए गए बैलेंस्ड बाइनरी सर्च ट्री और लक्ष्य योग के संबंध में, हम एक ऐसा फ़ंक्शन लिखते हैं जो सही होता है यदि योग के साथ एक जोड़ी लक्ष्य योग के बराबर होती है, अन्यथा झूठी वापसी होती है। इस मामले में, अपेक्षित समय जटिलता ओ (एन) है और केवल ओ (लॉगन) अतिरिक्त स्थान लागू किया जा सकता है। यहां, बाइनरी सर्च ट्री में किसी भी संशोधन की अनुमति नहीं है। हमें ध्यान रखना होगा कि संतुलित बीएसटी की ऊंचाई हमेशा ओ (लॉगन) होती है।
उदाहरण
विधि
Brute Force Solution के अनुसार, हम BST में प्रत्येक जोड़ी पर विचार करते हैं और सत्यापित करते हैं कि योग X के बराबर है या नहीं। इस समाधान की समय जटिलता O(n^2) होगी।
अब एक बेहतर उपाय यह है कि एक सहायक सरणी का निर्माण किया जाए और सरणी में BST के इनऑर्डर ट्रैवर्सल को संग्रहीत किया जाए। इस मामले में, सरणी को सॉर्ट किया जाएगा क्योंकि बीएसटी के इनऑर्डर ट्रैवर्सल हमेशा सॉर्ट किए गए डेटा का उत्पादन करते हैं। तो एक बार इनऑर्डर ट्रैवर्सल की उपलब्धता के बाद, हम ओ (एन) समय में जोड़ सकते हैं। याद रखें, यह समाधान O(n) समय में काम करता है, लेकिन इसके लिए O(n) सहायक स्थान की आवश्यकता होती है।
उदाहरण
// Java code to find a pair with given sum // in a Balanced BST import java.util.ArrayList; // A binary tree node class Node1 { int data1; Node1 left1, right1; Node1(int d){ data1 = d; left1 = right1 = null; } } public class BinarySearchTree { // Indicates root of BST Node1 root1; // Indicates constructor BinarySearchTree(){ root1 = null; } // Indicates inorder traversal of the tree void inorder(){ inorderUtil1(this.root1); } // Indicates utility function for inorder traversal of the tree void inorderUtil1(Node1 node1){ if (node1 == null) return; inorderUtil1(node1.left1); System.out.print(node1.data1 + " "); inorderUtil1(node1.right1); } // Now this method mainly calls insertRec() void insert(int key1){ root1 = insertRec1(root1, key1); } /* Indicates a recursive function to insert a new key in BST */ Node1 insertRec1(Node1 root1, int data1){ /* So if the tree is empty, return a new node */ if (root1 == null) { root1 = new Node1(data1); return root1; } /* Otherwise, recur down the tree */ if (data1 < root1.data1) root1.left1 = insertRec1(root1.left1, data1); else if (data1 > root1.data1) root1.right1 = insertRec1(root1.right1, data1); return root1; } // Indicates method that adds values of given BST into ArrayList // and hence returns the ArrayList ArrayList<Integer> treeToList(Node1 node1, ArrayList<Integer> list1){ // Indicates Base Case if (node1 == null) return list1; treeToList(node1.left1, list1); list1.add(node1.data1); treeToList(node1.right1, list1); return list1; } // Indicates method that checks if there is a pair present boolean isPairPresent(Node1 node1, int target1){ // Now this list a1 is passed as an argument // in treeToList method // which is later on filled by the values of BST ArrayList<Integer> a1 = new ArrayList<>(); // Now a2 list contains all the values of BST // returned by treeToList method ArrayList<Integer> a2 = treeToList(node1, a1); int start1 = 0; // Indicates starting index of a2 int end1 = a2.size() - 1; // Indicates ending index of a2 while (start1 < end1) { if (a2.get(start1) + a2.get(end1) == target1) // Target Found!{ System.out.println("Pair Found: " + a2.get(start1) + " + " + a2.get(end1) + " " + "= " + target1); return true; } if (a2.get(start1) + a2.get(end1) > target1) // decrements end { end1--; } if (a2.get(start1) + a2.get(end1) < target1) // increments start { start1++; } } System.out.println("No such values are found!"); return false; } // Driver function public static void main(String[] args){ BinarySearchTree tree1 = new BinarySearchTree(); /* 16 / \ 11 21 / \ / \ 9 13 17 26 */ tree1.insert(16); tree1.insert(11); tree1.insert(21); tree1.insert(9); tree1.insert(13); tree1.insert(17); tree1.insert(26); tree1.isPairPresent(tree1.root1, 34); } }
आउटपुट
Pair Found: 13 + 21 = 34