Problem
Given a binary tree, the task is to find a pair with the given sum. The elements of the tree are pairwise distinct.
Sample Input
Sum = 11
Sample Output
Pair is (4, 7)
Approach
We will use an unordered set to solve this problem. This is because an unordered set gives the time complexity of O(1) if there are not many duplicates present in it. Since, in the BST, we have all values different, we can use this data structure for the solution.
We traverse the tree and keep inserting the elements into the set. If we see that ( sum-current node) exists in the set, we have found the pair. Otherwise, we keep on searching for the tree.
Complexity Analysis
The time complexity would be O(N) as we are traversing the entire tree. The space complexity would be O(N) due to the call stack and auxiliary data structure.
C++ Programming
#include<bits/stdc++.h> using namespace std; struct TreeNode { int val; TreeNode *left, *right; }; // create new bode TreeNode* newNode(int ele) { TreeNode* node = new TreeNode; node->val = ele; node->left = node->right = nullptr; return node; } // insert new node TreeNode* insert(TreeNode* root, int ele) { // if the root is null if (root == nullptr) { return newNode(ele); } // if the given ele is less than the root node if (ele < root->val) { root->left = insert(root->left, ele); } // if the given ele is more than the root node else { root->right = insert(root->right, ele); } return root; } bool solve(TreeNode* root, int sum, auto &us) { // base case if (root == nullptr) { return false; } // return true if pair is found in the left subtree if (solve(root->left, sum, us)) { return true; } // if the pair found if (us.find(sum - root->val) != us.end()) { cout << "Pair is (" << sum - root->val << ", " << root->val << ")"; return true; } // insert the current node's value into the set else { us.insert(root->val); } // search in the right subtree return solve(root->right, sum, us); } int main() { int values[] = {1, 3, 4, 6, 7, 8, 10, 13, 14}; TreeNode* root = nullptr; for (int ele: values) { root = insert(root, ele); } int sum = 11; unordered_set<int> us; if (!solve(root, sum, us)) { cout << "Pair not present"; } return 0; }
Output
Pair is (4, 7)
Java Programming
import java.util.HashSet; import java.util.Set; class TreeNode { int val; TreeNode left = null, right = null; TreeNode(int val) { this.val = val; } } class Main { // insert nodes public static TreeNode insert(TreeNode root, int ele) { // if the root is null, create node if (root == null) { return new TreeNode(ele); } // if the given ele is less than the root node if (ele < root.val) { root.left = insert(root.left, ele); } // if the given ele is more than the root node else { root.right = insert(root.right, ele); } return root; } public static boolean solve(TreeNode root, int sum, Set<Integer> us) { // base case if (root == null) { return false; } // return true if pair is found in the left subtree if (solve(root.left, sum, us)) { return true; } // if a pair is formed with the current node if (us.contains(sum - root.val)) { System.out.print("Pair is (" + (sum - root.val) + ", " + root.val + ")"); return true; } // insert the current node's value into the set else { us.add(root.val); } // search in the right subtree return solve(root.right, sum, us); } public static void main(String[] args) { int[] values = {1, 3, 4, 6, 7, 8, 10, 13, 14}; TreeNode root = null; for (int ele: values) { root = insert(root, ele); } int sum = 11; // create an empty set Set<Integer> us = new HashSet<>(); if (!solve(root, sum, us)) { System.out.print("Pair not present"); } } }
Output
Pair is (4, 7)
Python Programming
class TreeNode: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right # insert keys into BST def insert(root, key): # if the root is None, create a new node if root is None: return TreeNode(key) # if the given key is less than the root node if key < root.val: root.left = insert(root.left, key) # if the given key is more than the root node else: root.right = insert(root.right, key) return root def check(root, sum, us): # base case if root is None: return False # return true if pair is found in the left subtree if check(root.left, sum, us): return True # if a pair is formed with the current node if sum - root.val in us: print("Pair is", (sum - root.val, root.val)) return True # insert the current node's value into the set else: us.add(root.val) # search in the right subtree return check(root.right, sum, us) keys = [1, 3, 4, 6, 7, 8, 10, 13, 14] root = None for key in keys: root = insert(root, key) sum = 11 # create an empty set us = set() if not check(root, sum, us): print("Pair not present")
Output
Pair is (4, 7)
Conclusion
In this tutorial, we have used an unordered set to find a pair with the given sum, i.e., 11, in a binary tree, provided that the elements in the tree are pairwise distinct. We have implemented it in three different languages, namely Python, Java, and C++. Since all the elements in a tree are distinct, using an unordered set gives the time complexity of O(1).
If you have any queries regarding the implementation of the above program, feel free to share them in the comments section below.
People are also reading:
- Construction of an Expression Tree
- Create a mirror of an m–ary Tree
- Print a two-dimensional view of a Binary Tree
- Rearrange an array such that arr[i] = i
- Rod Cutting Problem
- Print all subarrays with 0 sum
- Merge Two Sorted Arrays in-place
- Diameter of a Binary Tree
- Bottom View of a Binary Tree
- Reverse a Linked List
Leave a Comment on this Post