Print all pairs from two BSTs whose sum is greater than the given value

Given two Binary Search Tree (BSTs) and a value X, the problem is to print all pairs from both the BSTs whose sum is greater than the given value X.\
Examples:
Input:
BST 1:
5
/ \
3 7
/ \ / \
2 4 6 8
BST 2:
10
/ \
6 15
/ \ / \
3 8 11 18
X = 20
Output: The pairs are:
(3, 18)
(4, 18)
(5, 18)
(6, 18)
(7, 18)
(8, 18)
(6, 15)
(7, 15)
(8, 15)
Naive Approach: For each node value A in BST 1, search the value in BST 2 which is greater than the (X – A). If the value is found then print the pair.
Below is the implementation of the approach:
C++
// C++ implementation to print pairs// from two BSTs whose sum is greater// the given value x#include <bits/stdc++.h>using namespace std;// Structure of each node of BSTstruct node { int key; struct node *left, *right;};// Function to create a new BST nodenode* newNode(int item){ node* temp = new node(); temp->key = item; temp->left = temp->right = NULL; return temp;}// A utility function to insert a// new node with given key in BSTstruct node* insert(struct node* node, int key){ // If the tree is empty, return a new node if (node == NULL) return newNode(key); // Otherwise, recur down the tree if (key < node->key) node->left = insert(node->left, key); else if (key > node->key) node->right = insert(node->right, key); // Return the (unchanged) node pointer return node;}// Function to return the size of// the treeint sizeOfTree(node* root){ if (root == NULL) { return 0; } // Calculate left size recursively int left = sizeOfTree(root->left); // Calculate right size recursively int right = sizeOfTree(root->right); // Return total size recursively return (left + right + 1);}// Function to store inorder// traversal of BSTvoid storeInorder(node* root, int inOrder[], int& index){ // Base condition if (root == NULL) { return; } // Left recursive call storeInorder(root->left, inOrder, index); // Store elements in inorder array inOrder[index++] = root->key; // Right recursive call storeInorder(root->right, inOrder, index);}// Utility function to check the// pair of BSTs whose sum is// greater than given value xvoid printPairUtil(int inOrder1[], int inOrder2[], int index1, int index2, int k){ // loop through every pairs formed from // inOrder1 and inOrder2 elements for (int i = 0; i < index1; i++) { for (int j = 0; j < index2; j++) { // store sum of the pairs int sum = inOrder1[i] + inOrder2[j]; // if sum comes out to be greater than X // print the pair if (sum > k) cout << "(" << inOrder1[i] << ", " << inOrder2[j] << ")" << endl; } }}// Function to check the// pair of BSTs whose sum is// greater than given value xvoid printPairs(node* root1, node* root2, int k){ // Store the size of BST1 int numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 int inOrder1[numNode + 1]; int index1 = 0; // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 int inOrder2[numNode + 1]; int index2 = 0; // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1, index2, k);}// Driver codeint main(){ /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ struct node* root1 = NULL; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ struct node* root2 = NULL; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); int x = 20; // Print pairs printPairs(root1, root2, x); return 0;} |
Java
// Java implementation to print pairs// from two BSTs whose sum is greater// the given value x// Structure of each Node of BSTclass Node { int key; Node left, right;}class RefInteger { Integer value; public RefInteger(Integer value) { this.value = value; }}class GFG { // Function to create a new BST Node static Node newNode(int item) { Node temp = new Node(); temp.key = item; temp.left = temp.right = null; return temp; } // A utility function to insert a // new Node with given key in BST static Node insert(Node node, int key) { // If the tree is empty, // return a new Node if (node == null) return newNode(key); // Otherwise, recur down the tree if (key < node.key) node.left = insert(node.left, key); else if (key > node.key) node.right = insert(node.right, key); // Return the (unchanged) Node pointer return node; } // Function to return the size of // the tree static int sizeOfTree(Node root) { if (root == null) { return 0; } // Calculate left size recursively int left = sizeOfTree(root.left); // Calculate right size recursively int right = sizeOfTree(root.right); // Return total size recursively return (left + right + 1); } // Function to store inorder // traversal of BST static void storeInorder(Node root, int inOrder[], RefInteger index) { // Base condition if (root == null) { return; } // Left recursive call storeInorder(root.left, inOrder, index); // Store elements in inorder array inOrder[index.value++] = root.key; // Right recursive call storeInorder(root.right, inOrder, index); } // Utility function to check the // pair of BSTs whose sum is // greater than given value x static void printPairUtil(int inOrder1[], int inOrder2[], int index1, int index2, int k) { // loop through every pairs formed from inOrder1 and // inOrder2 elements for (int i = 0; i < index1; i++) { for (int j = 0; j < index2; j++) { // store sum of the pairs int sum = inOrder1[i] + inOrder2[j]; // if sum comes out to be greater than k, // print the pair if (sum > k) System.out.println("(" + inOrder1[i] + ", " + inOrder2[j] + ")"); } } } // Function to check the pair of // BSTs whose sum is greater than // given value x static void printPairs(Node root1, Node root2, int k) { // Store the size of BST1 int numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 int[] inOrder1 = new int[numNode + 1]; RefInteger index1 = new RefInteger(0); // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 int[] inOrder2 = new int[numNode + 1]; RefInteger index2 = new RefInteger(0); // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1.value, index2.value, k); } // Driver code public static void main(String[] args) { /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ Node root1 = null; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ Node root2 = null; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); int x = 20; // Print pairs printPairs(root1, root2, x); }} |
Python3
# Python3 implementation to print pairs# from two BSTs whose sum is greater# the given value xindex = 0# Structure of each node of BSTclass newNode: def __init__(self, item): self.key = item self.left = None self.right = None# A utility function to insert a# new node with given key in BSTdef insert(node, key): # If the tree is empty, # return a new node if (node == None): return newNode(key) # Otherwise, recur down the tree if (key < node.key): node.left = insert(node.left, key) elif (key > node.key): node.right = insert(node.right, key) # Return the (unchanged) node pointer return node# Function to return the size of# the treedef sizeOfTree(root): if (root == None): return 0 # Calculate left size recursively left = sizeOfTree(root.left) # Calculate right size recursively right = sizeOfTree(root.right) # Return total size recursively return (left + right + 1)# Function to store inorder# traversal of BSTdef storeInorder(root, inOrder): global index # Base condition if (root == None): return # Left recursive call storeInorder(root.left, inOrder) # Store elements in inorder array inOrder[index] = root.key index += 1 # Right recursive call storeInorder(root.right, inOrder)# Utility function to check the# pair of BSTs whose sum is# greater than given value xdef printPairUtil(inOrder1, inOrder2, index1, index2, k): # loop through every pairs formed from # inOrder1 and inOrder2 elements for i in range(index1): for j in range(index2): # store sum of the pairs _sum = inOrder1[i] + inOrder2[j] # if sum comes out to be greater than X # print the pair if _sum > k: print("(", inOrder1[i], ",", inOrder2[j], ")") # Function to check the# pair of BSTs whose sum is# greater than given value xdef printPairs(root1, root2, k): global index # Store the size of BST1 numNode = sizeOfTree(root1) # Take auxiliary array for storing # The inorder traversal of BST1 inOrder1 = [0 for i in range(numNode + 1)] index1 = 0 # Store the size of BST2 numNode = sizeOfTree(root2) # Take auxiliary array for storing # The inorder traversal of BST2 inOrder2 = [0 for i in range(numNode + 1)] index2 = 0 # Function call for storing # inorder traversal of BST1 index = 0 storeInorder(root1, inOrder1) temp1 = index # Function call for storing # inorder traversal of BST1 index = 0 storeInorder(root2, inOrder2) temp2 = index # Utility function call to count # the pair printPairUtil(inOrder1, inOrder2, temp1, temp2 , k)# Driver codeif __name__ == '__main__': ''' Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 ''' root1 = None root1 = insert(root1, 5) insert(root1, 3) insert(root1, 2) insert(root1, 4) insert(root1, 7) insert(root1, 6) insert(root1, 8) '''Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 ''' root2 = None root2 = insert(root2, 10) insert(root2, 6) insert(root2, 15) insert(root2, 3) insert(root2, 8) insert(root2, 11) insert(root2, 18) x = 20 # Print pairs printPairs(root1, root2, x) # This code is contributed by Chandramani |
C#
// C# implementation to print pairs// from two BSTs whose sum is greater// the given value xusing System;class GFG{public class Refint{ public int value; public Refint(int value) { this.value = value; }}// Structure of each Node of BSTpublic class Node{ public int key; public Node left, right;};// Function to create a new BST Nodestatic Node newNode(int item){ Node temp = new Node(); temp.key = item; temp.left = temp.right = null; return temp;}// A utility function to insert a// new Node with given key in BSTstatic Node insert(Node Node, int key){ // If the tree is empty, // return a new Node if (Node == null) return newNode(key); // Otherwise, recur down the tree if (key < Node.key) Node.left = insert(Node.left, key); else if (key > Node.key) Node.right = insert(Node.right, key); // Return the (unchanged) Node pointer return Node;}// Function to return the size of// the treestatic int sizeOfTree(Node root){ if (root == null) { return 0; } // Calculate left size recursively int left = sizeOfTree(root.left); // Calculate right size recursively int right = sizeOfTree(root.right); // Return total size recursively return (left + right + 1);}// Function to store inorder// traversal of BSTstatic void storeInorder(Node root, int []inOrder, Refint index){ // Base condition if (root == null) { return; } // Left recursive call storeInorder(root.left, inOrder, index); // Store elements in inorder array inOrder[index.value++] = root.key; // Right recursive call storeInorder(root.right, inOrder, index);}// Function to print the pairsstatic void print(int []inOrder1, int i, int index1, int value){ while (i < index1) { Console.WriteLine("(" + inOrder1[i] + ", " + value + ")"); i++; }}// Utility function to check the// pair of BSTs whose sum is// greater than given value xstatic void printPairUtil(int []inOrder1, int []inOrder2, int index1, int index2, int k){ // loop through every pairs formed from // inOrder1 and inOrder2 elements for (int i = 0; i < index1; i++) { for (int j = 0; j < index2; j++) { // store sum of the pairs int sum = inOrder1[i] + inOrder2[j]; // if sum comes out to be greater than X // print the pair if (sum > k) Console.WriteLine("(" + inOrder1[i] + ", " + inOrder2[j] + ")" ); } }}// Function to check the pair of// BSTs whose sum is greater than// given value xstatic void printPairs(Node root1, Node root2, int k){ // Store the size of BST1 int numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 int[] inOrder1 = new int[numNode + 1]; Refint index1 = new Refint(0); // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 int[] inOrder2 = new int[numNode + 1]; Refint index2 = new Refint(0); // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1.value, index2.value , k);}// Driver codepublic static void Main(string[] args){ /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ Node root1 = null; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ Node root2 = null; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); int x = 20; // Print pairs printPairs(root1, root2, x);}} |
Javascript
class Node { constructor(key) { this.key = key; this.left = null; this.right = null; }}// Function to insert a new node in BSTfunction insert(root, key) { if (root === null) { return new Node(key); } if (key < root.key) { root.left = insert(root.left, key); } else if (key > root.key) { root.right = insert(root.right, key); } return root;}// Function to calculate the size of the treefunction sizeOfTree(root) { if (root === null) { return 0; } let left = sizeOfTree(root.left); let right = sizeOfTree(root.right); return left + right + 1;}// Function to store inorder traversal of BSTfunction storeInorder(root, inOrder, index) { if (root === null) { return index; } index = storeInorder(root.left, inOrder, index); inOrder[index++] = root.key; index = storeInorder(root.right, inOrder, index); return index;}// Utility function to check pairs of BSTs whose sum is greater than xfunction printPairUtil(inOrder1, inOrder2, index1, index2, k) { let result = []; let i = 0; let j = index2 - 1; while (i < index1 && j >= 0) { let sum = inOrder1[i] + inOrder2[j]; if (sum > k) { for (let a = i; a < index1; a++) { for (let b = j; b >= 0; b--) { let currSum = inOrder1[a] + inOrder2[b]; if (currSum > k) { result.push(`(${inOrder1[a]}, ${inOrder2[b]})`); } else { break; } } } j--; } else { i++; } } return result;}// Function to check pairs of BSTs whose sum is greater than xfunction printPairs(root1, root2, k) { let numNode1 = sizeOfTree(root1); let inOrder1 = new Array(numNode1); let index1 = 0; let numNode2 = sizeOfTree(root2); let inOrder2 = new Array(numNode2); let index2 = 0; index1 = storeInorder(root1, inOrder1, index1); index2 = storeInorder(root2, inOrder2, index2); let pairs = printPairUtil(inOrder1, inOrder2, index1, index2, k); pairs.forEach(pair => console.log(pair));}let root1 = null;root1 = insert(root1, 5);insert(root1, 3);insert(root1, 2);insert(root1, 4);insert(root1, 7);insert(root1, 6);insert(root1, 8);let root2 = null;root2 = insert(root2, 10);insert(root2, 6);insert(root2, 15);insert(root2, 3);insert(root2, 8);insert(root2, 11);insert(root2, 18);let x = 20;printPairs(root1, root2, x); |
(3, 18) (4, 18) (5, 18) (6, 15) (6, 18) (7, 15) (7, 18) (8, 15) (8, 18)
Time Complexity: O(N1*N2) where N1 and N2 are size of inOrder1 and inOrder2 arrays respectively as two nested loops are executed in printPairUtil function.
Space Complexity: O(N1+N2) as two arrays inOrder1 and inOrder2 are created.
Efficient Approach:
- Traverse BST 1 from smallest value to node to largest by taking index i. This can be achieved with the help of inorder traversal.
- Traverse BST 2 from largest value node to smallest by taking index j. This can be achieved with the help of inorder traversal.
- Perform these two traversals one by one and store into two array.
- Sum up the corresponding node’s value from both the BSTs at a particular instance of traversals.
- If sum > x, then print pair and decrement j by 1.
- If x > sum, then increment i by 1.
Below is the implementation of the above approach:
C++
// C++ implementation to print pairs// from two BSTs whose sum is greater// the given value x#include <bits/stdc++.h>using namespace std;// Structure of each node of BSTstruct node { int key; struct node *left, *right;};// Function to create a new BST nodenode* newNode(int item){ node* temp = new node(); temp->key = item; temp->left = temp->right = NULL; return temp;}// A utility function to insert a// new node with given key in BSTstruct node* insert(struct node* node, int key){ // If the tree is empty, return a new node if (node == NULL) return newNode(key); // Otherwise, recur down the tree if (key < node->key) node->left = insert(node->left, key); else if (key > node->key) node->right = insert(node->right, key); // Return the (unchanged) node pointer return node;}// Function to return the size of// the treeint sizeOfTree(node* root){ if (root == NULL) { return 0; } // Calculate left size recursively int left = sizeOfTree(root->left); // Calculate right size recursively int right = sizeOfTree(root->right); // Return total size recursively return (left + right + 1);}// Function to store inorder// traversal of BSTvoid storeInorder(node* root, int inOrder[], int& index){ // Base condition if (root == NULL) { return; } // Left recursive call storeInorder(root->left, inOrder, index); // Store elements in inorder array inOrder[index++] = root->key; // Right recursive call storeInorder(root->right, inOrder, index);}// Function to print the pairsvoid print(int inOrder1[], int i, int index1, int value){ while (i < index1) { cout << "(" << inOrder1[i] << ", " << value << ")" << endl; i++; }}// Utility function to check the// pair of BSTs whose sum is// greater than given value xvoid printPairUtil(int inOrder1[], int inOrder2[], int index1, int j, int k){ int i = 0; while (i < index1 && j >= 0) { if (inOrder1[i] + inOrder2[j] > k) { print(inOrder1, i, index1, inOrder2[j]); j--; } else { i++; } }}// Function to check the// pair of BSTs whose sum is// greater than given value xvoid printPairs(node* root1, node* root2, int k){ // Store the size of BST1 int numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 int inOrder1[numNode + 1]; int index1 = 0; // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 int inOrder2[numNode + 1]; int index2 = 0; // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1, index2 - 1, k);}// Driver codeint main(){ /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ struct node* root1 = NULL; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ struct node* root2 = NULL; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); int x = 20; // Print pairs printPairs(root1, root2, x); return 0;} |
Java
// Java implementation to print pairs// from two BSTs whose sum is greater// the given value xclass GFG{static class RefInteger{ Integer value; public RefInteger(Integer value) { this.value = value; }}// Structure of each Node of BSTstatic class Node { int key; Node left, right;};// Function to create a new BST Nodestatic Node newNode(int item) { Node temp = new Node(); temp.key = item; temp.left = temp.right = null; return temp;}// A utility function to insert a// new Node with given key in BSTstatic Node insert(Node Node, int key){ // If the tree is empty, // return a new Node if (Node == null) return newNode(key); // Otherwise, recur down the tree if (key < Node.key) Node.left = insert(Node.left, key); else if (key > Node.key) Node.right = insert(Node.right, key); // Return the (unchanged) Node pointer return Node;}// Function to return the size of// the treestatic int sizeOfTree(Node root) { if (root == null) { return 0; } // Calculate left size recursively int left = sizeOfTree(root.left); // Calculate right size recursively int right = sizeOfTree(root.right); // Return total size recursively return (left + right + 1);}// Function to store inorder// traversal of BSTstatic void storeInorder(Node root, int inOrder[], RefInteger index) { // Base condition if (root == null) { return; } // Left recursive call storeInorder(root.left, inOrder, index); // Store elements in inorder array inOrder[index.value++] = root.key; // Right recursive call storeInorder(root.right, inOrder, index);}// Function to print the pairsstatic void print(int inOrder1[], int i, int index1, int value) { while (i < index1) { System.out.println("(" + inOrder1[i] + ", " + value + ")"); i++; }}// Utility function to check the// pair of BSTs whose sum is// greater than given value xstatic void printPairUtil(int inOrder1[], int inOrder2[], int index1, int j, int k){ int i = 0; while (i < index1 && j >= 0) { if (inOrder1[i] + inOrder2[j] > k) { print(inOrder1, i, index1, inOrder2[j]); j--; } else { i++; } }}// Function to check the pair of // BSTs whose sum is greater than // given value xstatic void printPairs(Node root1, Node root2, int k){ // Store the size of BST1 int numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 int[] inOrder1 = new int[numNode + 1]; RefInteger index1 = new RefInteger(0); // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 int[] inOrder2 = new int[numNode + 1]; RefInteger index2 = new RefInteger(0); // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1.value, index2.value - 1, k);}// Driver codepublic static void main(String[] args) { /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ Node root1 = null; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ Node root2 = null; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); int x = 20; // Print pairs printPairs(root1, root2, x);}}// This code is contributed by sanjeev2552 |
Python3
# Python3 implementation to print pairs# from two BSTs whose sum is greater# the given value xindex = 0# Structure of each node of BSTclass newNode: def __init__(self, item): self.key = item self.left = None self.right = None# A utility function to insert a# new node with given key in BSTdef insert(node, key): # If the tree is empty, # return a new node if (node == None): return newNode(key) # Otherwise, recur down the tree if (key < node.key): node.left = insert(node.left, key) elif (key > node.key): node.right = insert(node.right, key) # Return the (unchanged) node pointer return node# Function to return the size of# the treedef sizeOfTree(root): if (root == None): return 0 # Calculate left size recursively left = sizeOfTree(root.left) # Calculate right size recursively right = sizeOfTree(root.right) # Return total size recursively return (left + right + 1)# Function to store inorder# traversal of BSTdef storeInorder(root, inOrder): global index # Base condition if (root == None): return # Left recursive call storeInorder(root.left, inOrder) # Store elements in inorder array inOrder[index] = root.key index += 1 # Right recursive call storeInorder(root.right, inOrder)# Function to print the pairsdef print1(inOrder1, i, index1, value): while (i < index1): print("(", inOrder1[i], ",", value, ")") i += 1# Utility function to check the# pair of BSTs whose sum is# greater than given value xdef printPairUtil(inOrder1, inOrder2, index1, j, k): i = 0 while (i < index1 and j >= 0): if (inOrder1[i] + inOrder2[j] > k): print1(inOrder1, i, index1, inOrder2[j]) j -= 1 else: i += 1# Function to check the# pair of BSTs whose sum is# greater than given value xdef printPairs(root1, root2, k): global index # Store the size of BST1 numNode = sizeOfTree(root1) # Take auxiliary array for storing # The inorder traversal of BST1 inOrder1 = [0 for i in range(numNode + 1)] index1 = 0 # Store the size of BST2 numNode = sizeOfTree(root2) # Take auxiliary array for storing # The inorder traversal of BST2 inOrder2 = [0 for i in range(numNode + 1)] index2 = 0 # Function call for storing # inorder traversal of BST1 index = 0 storeInorder(root1, inOrder1) temp1 = index # Function call for storing # inorder traversal of BST1 index = 0 storeInorder(root2, inOrder2) temp2 = index # Utility function call to count # the pair printPairUtil(inOrder1, inOrder2, temp1, temp2 - 1, k)# Driver codeif __name__ == '__main__': ''' Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 ''' root1 = None root1 = insert(root1, 5) insert(root1, 3) insert(root1, 2) insert(root1, 4) insert(root1, 7) insert(root1, 6) insert(root1, 8) '''Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 ''' root2 = None root2 = insert(root2, 10) insert(root2, 6) insert(root2, 15) insert(root2, 3) insert(root2, 8) insert(root2, 11) insert(root2, 18) x = 20 # Print pairs printPairs(root1, root2, x) # This code is contributed by ipg2016107 |
C#
// C# implementation to print pairs// from two BSTs whose sum is greater// the given value xusing System;class GFG{ public class Refint{ public int value; public Refint(int value) { this.value = value; }} // Structure of each Node of BSTpublic class Node { public int key; public Node left, right;}; // Function to create a new BST Nodestatic Node newNode(int item) { Node temp = new Node(); temp.key = item; temp.left = temp.right = null; return temp;} // A utility function to insert a// new Node with given key in BSTstatic Node insert(Node Node, int key){ // If the tree is empty, // return a new Node if (Node == null) return newNode(key); // Otherwise, recur down the tree if (key < Node.key) Node.left = insert(Node.left, key); else if (key > Node.key) Node.right = insert(Node.right, key); // Return the (unchanged) Node pointer return Node;} // Function to return the size of// the treestatic int sizeOfTree(Node root) { if (root == null) { return 0; } // Calculate left size recursively int left = sizeOfTree(root.left); // Calculate right size recursively int right = sizeOfTree(root.right); // Return total size recursively return (left + right + 1);} // Function to store inorder// traversal of BSTstatic void storeInorder(Node root, int []inOrder, Refint index) { // Base condition if (root == null) { return; } // Left recursive call storeInorder(root.left, inOrder, index); // Store elements in inorder array inOrder[index.value++] = root.key; // Right recursive call storeInorder(root.right, inOrder, index);} // Function to print the pairsstatic void print(int []inOrder1, int i, int index1, int value) { while (i < index1) { Console.WriteLine("(" + inOrder1[i] + ", " + value + ")"); i++; }} // Utility function to check the// pair of BSTs whose sum is// greater than given value xstatic void printPairUtil(int []inOrder1, int []inOrder2, int index1, int j, int k){ int i = 0; while (i < index1 && j >= 0) { if (inOrder1[i] + inOrder2[j] > k) { print(inOrder1, i, index1, inOrder2[j]); j--; } else { i++; } }} // Function to check the pair of // BSTs whose sum is greater than // given value xstatic void printPairs(Node root1, Node root2, int k){ // Store the size of BST1 int numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 int[] inOrder1 = new int[numNode + 1]; Refint index1 = new Refint(0); // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 int[] inOrder2 = new int[numNode + 1]; Refint index2 = new Refint(0); // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1.value, index2.value - 1, k);} // Driver codepublic static void Main(string[] args) { /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ Node root1 = null; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ Node root2 = null; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); int x = 20; // Print pairs printPairs(root1, root2, x);}}// This code is contributed by rutvik_56 |
Javascript
<script> // JavaScript implementation to print pairs // from two BSTs whose sum is greater // the given value x class Refint { constructor(value) { this.value = value; } } // Structure of each Node of BST class Node { constructor(item) { this.left = null; this.right = null; this.key = item; } } // Function to create a new BST Node function newNode(item) { let temp = new Node(item); return temp; } // A utility function to insert a // new Node with given key in BST function insert(Node, key) { // If the tree is empty, // return a new Node if (Node == null) return newNode(key); // Otherwise, recur down the tree if (key < Node.key) Node.left = insert(Node.left, key); else if (key > Node.key) Node.right = insert(Node.right, key); // Return the (unchanged) Node pointer return Node; } // Function to return the size of // the tree function sizeOfTree(root) { if (root == null) { return 0; } // Calculate left size recursively let left = sizeOfTree(root.left); // Calculate right size recursively let right = sizeOfTree(root.right); // Return total size recursively return (left + right + 1); } // Function to store inorder // traversal of BST function storeInorder(root, inOrder, index) { // Base condition if (root == null) { return; } // Left recursive call storeInorder(root.left, inOrder, index); // Store elements in inorder array inOrder[index.value++] = root.key; // Right recursive call storeInorder(root.right, inOrder, index); } // Function to print the pairs function print(inOrder1, i, index1, value) { while (i < index1) { document.write("(" + inOrder1[i] + ", " + value + ")" + "</br>"); i++; } } // Utility function to check the // pair of BSTs whose sum is // greater than given value x function printPairUtil(inOrder1, inOrder2, index1, j, k) { let i = 0; while (i < index1 && j >= 0) { if (inOrder1[i] + inOrder2[j] > k) { print(inOrder1, i, index1, inOrder2[j]); j--; } else { i++; } } } // Function to check the pair of // BSTs whose sum is greater than // given value x function printPairs(root1, root2, k) { // Store the size of BST1 let numNode = sizeOfTree(root1); // Take auxiliary array for storing // The inorder traversal of BST1 let inOrder1 = new Array(numNode + 1); let index1 = new Refint(0); // Store the size of BST2 numNode = sizeOfTree(root2); // Take auxiliary array for storing // The inorder traversal of BST2 let inOrder2 = new Array(numNode + 1); let index2 = new Refint(0); // Function call for storing // inorder traversal of BST1 storeInorder(root1, inOrder1, index1); // Function call for storing // inorder traversal of BST1 storeInorder(root2, inOrder2, index2); // Utility function call to count // the pair printPairUtil(inOrder1, inOrder2, index1.value, index2.value - 1, k); } /* Formation of BST 1 5 / \ 3 7 / \ / \ 2 4 6 8 */ let root1 = null; root1 = insert(root1, 5); insert(root1, 3); insert(root1, 2); insert(root1, 4); insert(root1, 7); insert(root1, 6); insert(root1, 8); /* Formation of BST 2 10 / \ 6 15 / \ / \ 3 8 11 18 */ let root2 = null; root2 = insert(root2, 10); insert(root2, 6); insert(root2, 15); insert(root2, 3); insert(root2, 8); insert(root2, 11); insert(root2, 18); let x = 20; // Print pairs printPairs(root1, root2, x);</script> |
(3, 18) (4, 18) (5, 18) (6, 18) (7, 18) (8, 18) (6, 15) (7, 15) (8, 15)
Time complexity: O(n1 * h2), where n1 is the number of nodes in the first BST and h2 is the height of the second BST.
Auxiliary Space: O(n), where n is the total number of nodes in the two BSTs
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



