Find a pair with given sum in BST

Given a BST and a sum, find if there is a pair with given sum.

Input : sum = 28
        Root of below tree

Output : Pair is found (16, 12)

We have discussed different approaches to find a pair with given sum in below post.Find a pair with given sum in a Balanced BST

In this post, hashing based solution is discussed. We traverse binary search tree by inorder way and insert node’s value into a set. Also check for any node, difference between given sum and node’s value in set, if it is found then pair exists otherwise it doesn’t exist.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find a pair with
// given sum using hashing
#include <bits/stdc++.h>
using namespace std;
  
struct Node {
    int data;
    struct Node *left, *right;
};
  
Node* NewNode(int data)
{
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->data = data;
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}
  
Node* insert(Node* root, int key)
{
    if (root == NULL)
        return NewNode(key);
    if (key < root->data)
        root->left = insert(root->left, key);
    else
        root->right = insert(root->right, key);
    return root;
}
  
bool findpairUtil(Node* root, int sum,  unordered_set<int> &set)
{
    if (root == NULL)
        return false;
  
    if (findpairUtil(root->left, sum, set))
        return true;
  
    if (set.find(sum - root->data) != set.end()) {
        cout << "Pair is found ("
             << sum - root->data << ", "
             << root->data << ")" << endl;
        return true;
    }
    else
        set.insert(root->data);
  
    return findpairUtil(root->right, sum, set);
}
  
void findPair(Node* root, int sum)
{
    unordered_set<int> set;
    if (!findpairUtil(root, sum, set))
        cout << "Pairs do not exit" << endl;
}
  
// Driver code
int main()
{
    Node* root = NULL;
    root = insert(root, 15);
    root = insert(root, 10);
    root = insert(root, 20);
    root = insert(root, 8);
    root = insert(root, 12);
    root = insert(root, 16);
    root = insert(root, 25);
    root = insert(root, 10);
  
    int sum = 33;
    findPair(root, sum);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// JAVA program to find a pair with
// given sum using hashing
  
import java.util.*;
  
class GFG 
{
  
    static class Node
    {
        int data;
        Node left, right;
    };
  
    static Node NewNode(int data) 
    {
        Node temp = new Node();
        temp.data = data;
        temp.left = null;
        temp.right = null;
        return temp;
    }
  
    static Node insert(Node root, int key) 
    {
        if (root == null)
            return NewNode(key);
        if (key < root.data)
            root.left = insert(root.left, key);
        else
            root.right = insert(root.right, key);
        return root;
    }
  
    static boolean findpairUtil(Node root, int sum,
                                HashSet<Integer> set) 
    {
        if (root == null)
            return false;
  
        if (findpairUtil(root.left, sum, set))
            return true;
  
        if (set.contains(sum - root.data)) 
        {
            System.out.println("Pair is found ("
                                (sum - root.data) +
                                ", " + root.data + ")");
            return true;
        
        else
            set.add(root.data);
  
        return findpairUtil(root.right, sum, set);
    }
  
    static void findPair(Node root, int sum) 
    {
        HashSet<Integer> set = new HashSet<Integer>();
        if (!findpairUtil(root, sum, set))
            System.out.print("Pairs do not exit" + "\n");
    }
  
    // Driver code
    public static void main(String[] args) 
    {
        Node root = null;
        root = insert(root, 15);
        root = insert(root, 10);
        root = insert(root, 20);
        root = insert(root, 8);
        root = insert(root, 12);
        root = insert(root, 16);
        root = insert(root, 25);
        root = insert(root, 10);
  
        int sum = 33;
        findPair(root, sum);
  
    }
}
  
// This code is contributed by PrinciRaj1992

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find a pair with 
# given sum using hashing 
import sys
import math
  
class Node:
    def __init__(self,data):
        self.data = data
        self.left = None
        self.right = None
  
def insert(root,data):
    if root is None:
        return Node(data)
    if(data < root.data):
        root.left = insert(root.left, data)
    if(data > root.data):
        root.right = insert(root.right, data)
    return root
  
def findPairUtil(root, summ, unsorted_set):
    if root is None:
        return False
    if findPairUtil(root.left,summ,unsorted_set):
        return True
    if unsorted_set and (summ-root.data) in unsorted_set:
        print("Pair is Found ({},{})".format(summ-root.data, root.data))
        return True
    else:
        unsorted_set.add(root.data)
  
    return findPairUtil(root.right,summ, unsorted_set)
  
def findPair(root,summ):
    unsorted_set = set()
    if(not findPairUtil(root,summ,unsorted_set)):
        print("Pair do not exist!")
  
# Driver code
if __name__=='__main__':
    root=None
    root = insert(root,15)
    root = insert(root,10)
    root = insert(root,20)
    root = insert(root,8)
    root = insert(root,12)
    root = insert(root,16)
    root = insert(root,25)
    root = insert(root,10)
    summ = 33
    findPair(root, summ)
  
# This code is contributed by Vikash Kumar 37

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find a pair with
// given sum using hashing
using System;
using System.Collections.Generic;
  
class GFG 
{
  
    class Node
    {
        public int data;
        public Node left, right;
    };
  
    static Node NewNode(int data) 
    {
        Node temp = new Node();
        temp.data = data;
        temp.left = null;
        temp.right = null;
        return temp;
    }
  
    static Node insert(Node root, int key) 
    {
        if (root == null)
            return NewNode(key);
        if (key < root.data)
            root.left = insert(root.left, key);
        else
            root.right = insert(root.right, key);
        return root;
    }
  
    static bool findpairUtil(Node root, int sum,
                                HashSet<int> set
    {
        if (root == null)
            return false;
  
        if (findpairUtil(root.left, sum, set))
            return true;
  
        if (set.Contains(sum - root.data)) 
        {
            Console.WriteLine("Pair is found ("
                                (sum - root.data) +
                                ", " + root.data + ")");
            return true;
        
        else
            set.Add(root.data);
  
        return findpairUtil(root.right, sum, set);
    }
  
    static void findPair(Node root, int sum) 
    {
        HashSet<int> set = new HashSet<int>();
        if (!findpairUtil(root, sum, set))
            Console.Write("Pairs do not exit" + "\n");
    }
  
    // Driver code
    public static void Main(String[] args) 
    {
        Node root = null;
        root = insert(root, 15);
        root = insert(root, 10);
        root = insert(root, 20);
        root = insert(root, 8);
        root = insert(root, 12);
        root = insert(root, 16);
        root = insert(root, 25);
        root = insert(root, 10);
  
        int sum = 33;
        findPair(root, sum);
  
    }
}
  
// This code is contributed by Rajput-Ji

chevron_right



Output:

Pair is found (8, 25)

Time Complexity is O(n).

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.