Bird
Raised Fist0
DSA C++programming~20 mins

Two Sum in BST in DSA C++ - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Two Sum in BST Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Two Sum in BST with target 9
Given the BST below and target = 9, what is the output of the Two Sum function that returns true if two nodes sum to the target?
DSA C++
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

bool findTarget(TreeNode* root, int k) {
    std::unordered_set<int> set;
    std::function<bool(TreeNode*)> dfs = [&](TreeNode* node) {
        if (!node) return false;
        if (set.count(k - node->val)) return true;
        set.insert(node->val);
        return dfs(node->left) || dfs(node->right);
    };
    return dfs(root);
}

// BST:
//       5
//      / \
//     3   6
//    / \   \
//   2   4   7

// Call: findTarget(root, 9);
ACompilation error
Bfalse
Ctrue
DRuntime error
Attempts:
2 left
💡 Hint
Think about pairs of nodes that add up to 9 in the BST.
❓ Predict Output
intermediate
2:00remaining
Output of Two Sum in BST with target 28
Given the BST below and target = 28, what is the output of the Two Sum function that returns true if two nodes sum to the target?
DSA C++
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

bool findTarget(TreeNode* root, int k) {
    std::unordered_set<int> set;
    std::function<bool(TreeNode*)> dfs = [&](TreeNode* node) {
        if (!node) return false;
        if (set.count(k - node->val)) return true;
        set.insert(node->val);
        return dfs(node->left) || dfs(node->right);
    };
    return dfs(root);
}

// BST:
//       10
//      /  \
//     5    15
//    / \     \
//   3   7     18

// Call: findTarget(root, 28);
Atrue
BCompilation error
Cfalse
DRuntime error
Attempts:
2 left
💡 Hint
Check if any two nodes sum to 28.
🔧 Debug
advanced
2:00remaining
Identify the error in Two Sum BST code
What error does the following Two Sum in BST code produce when run?
DSA C++
bool findTarget(TreeNode* root, int k) {
    std::unordered_set<int> set;
    std::function<bool(TreeNode*)> dfs = [&](TreeNode* node) {
        if (!node) return false;
        if (set.count(k - node->val)) return true;
        set.insert(node->val);
        return dfs(node->left) && dfs(node->right);
    };
    return dfs(root);
}
AAlways returns true
BAlways returns false
CStack overflow error
DCorrect output
Attempts:
2 left
💡 Hint
Look at the logical operator used in recursive calls.
🧠 Conceptual
advanced
2:00remaining
Time complexity of Two Sum in BST using hash set
What is the time complexity of finding if there exist two elements in a BST that sum to a target using a hash set and DFS traversal?
AO(n)
BO(n^2)
CO(log n)
DO(n log n)
Attempts:
2 left
💡 Hint
Consider visiting each node once and hash set operations.
🚀 Application
expert
3:00remaining
Output of Two Sum in BST using two-pointer approach
Given the BST below and target = 16, what is the output of the Two Sum function implemented using two iterators (inorder and reverse inorder) to find if two nodes sum to the target?
DSA C++
#include <stack>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class BSTIterator {
    std::stack<TreeNode*> stk;
    bool reverse;
public:
    BSTIterator(TreeNode* root, bool rev) : reverse(rev) {
        pushAll(root);
    }
    void pushAll(TreeNode* node) {
        while (node) {
            stk.push(node);
            node = reverse ? node->right : node->left;
        }
    }
    int next() {
        TreeNode* tmp = stk.top(); stk.pop();
        if (!reverse) pushAll(tmp->right);
        else pushAll(tmp->left);
        return tmp->val;
    }
    bool hasNext() {
        return !stk.empty();
    }
};

bool findTarget(TreeNode* root, int k) {
    if (!root) return false;
    BSTIterator l(root, false);
    BSTIterator r(root, true);
    int i = l.next();
    int j = r.next();
    while (i < j) {
        if (i + j == k) return true;
        else if (i + j < k) i = l.next();
        else j = r.next();
    }
    return false;
}

// BST:
//       8
//      / \
//     3   10
//    / \    \
//   1   6    14
//      / \   /
//     4   7 13

// Call: findTarget(root, 16);
ACompilation error
BRuntime error
Cfalse
Dtrue
Attempts:
2 left
💡 Hint
Check pairs from smallest and largest values moving inward.

Practice

(1/5)
1. What is the main goal of the Two Sum in BST problem?
easy
A. Find the maximum value in a BST
B. Find two nodes in a BST whose values add up to a target sum
C. Count the number of nodes in a BST
D. Check if a BST is balanced

Solution

  1. Step 1: Understand the problem statement

    The problem asks to find if there exist two nodes in a Binary Search Tree (BST) such that their values add up to a given target sum.
  2. Step 2: Identify the goal

    The goal is to check for the existence of such a pair, not to find maximum, count nodes, or check balance.
  3. Final Answer:

    Find two nodes in a BST whose values add up to a target sum -> Option B
  4. Quick Check:

    Two Sum in BST means finding two nodes summing to target [OK]
Hint: Look for two nodes adding to target in BST [OK]
Common Mistakes:
  • Confusing with finding max/min value
  • Thinking it counts nodes instead of pairs
  • Assuming it checks tree balance
2. Which of the following C++ code snippets correctly declares a BST node structure for the Two Sum problem?
easy
A. struct TreeNode { int val; TreeNode left; TreeNode* right; };
B. struct TreeNode { int val; TreeNode left; TreeNode right; };
C. struct TreeNode { int val; TreeNode* left; TreeNode* right; };
D. struct TreeNode { int val; TreeNode* left; TreeNode right; };

Solution

  1. Step 1: Check pointer usage in struct

    In C++, child nodes in a tree are pointers to TreeNode objects, so left and right must be pointers.
  2. Step 2: Validate each option

    struct TreeNode { int val; TreeNode* left; TreeNode* right; }; uses TreeNode* for left and right, which is correct. Options A, B, and C incorrectly use TreeNode without pointers for one or both children.
  3. Final Answer:

    struct TreeNode { int val; TreeNode* left; TreeNode* right; }; -> Option C
  4. Quick Check:

    BST nodes use pointers for children [OK]
Hint: Children in BST nodes are pointers in C++ [OK]
Common Mistakes:
  • Using objects instead of pointers for children
  • Mixing pointer and non-pointer types
  • Forgetting semicolon after struct
3. What is the output of the following code snippet that checks for two sum in BST?
struct TreeNode {
  int val;
  TreeNode* left;
  TreeNode* right;
  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

bool findTarget(TreeNode* root, int k) {
  std::unordered_set<int> seen;
  std::function dfs = [&](TreeNode* node) {
    if (!node) return false;
    if (seen.count(k - node->val)) return true;
    seen.insert(node->val);
    return dfs(node->left) || dfs(node->right);
  };
  return dfs(root);
}

int main() {
  TreeNode* root = new TreeNode(5);
  root->left = new TreeNode(3);
  root->right = new TreeNode(6);
  root->left->left = new TreeNode(2);
  root->left->right = new TreeNode(4);
  root->right->right = new TreeNode(7);
  
  bool result = findTarget(root, 9);
  std::cout << (result ? "true" : "false") << std::endl;
  return 0;
}
medium
A. true
B. false
C. Compilation error
D. Runtime error

Solution

  1. Step 1: Understand the tree and target

    The BST has nodes 5,3,6,2,4,7. The target sum is 9.
  2. Step 2: Trace the DFS and set usage

    DFS visits nodes and checks if (target - current node value) is in the set. For example, when visiting node 6, it checks if 9-6=3 is in set. Node 3 was visited before, so it returns true.
  3. Final Answer:

    true -> Option A
  4. Quick Check:

    3 + 6 = 9 found in BST [OK]
Hint: Check if complement exists in visited nodes set [OK]
Common Mistakes:
  • Assuming no pair exists without checking all nodes
  • Confusing DFS order with BFS
  • Ignoring the use of hash set for complements
4. Identify the bug in the following Two Sum in BST code snippet and select the correct fix:
bool findTarget(TreeNode* root, int k) {
  std::unordered_set<int> seen;
  std::function dfs = [&](TreeNode* node) {
    if (!node) return false;
    if (seen.count(k - node->val)) return true;
    dfs(node->left);
    dfs(node->right);
    seen.insert(node->val);
    return false;
  };
  return dfs(root);
}
medium
A. Insert node->val before recursive calls to children
B. Remove the unordered_set and use a vector instead
C. Change return false to return true at the end
D. Add a null check after inserting node->val

Solution

  1. Step 1: Analyze the order of operations

    The code inserts node->val into the set after recursive calls, so complements are not found when visiting children.
  2. Step 2: Fix the insertion timing

    Insert node->val before recursive calls so that children can find complements in the set.
  3. Final Answer:

    Insert node->val before recursive calls to children -> Option A
  4. Quick Check:

    Insert before recursion to find complements [OK]
Hint: Insert current value before recursion to detect complements [OK]
Common Mistakes:
  • Inserting after recursion causes missed pairs
  • Changing return values incorrectly
  • Replacing set with vector reduces efficiency
5. Given a BST with nodes [10, 5, 15, 3, 7, null, 18], how would you modify the Two Sum in BST algorithm to handle the case where the target sum is twice the value of a single node (e.g., target = 14 and node value = 7)?
hard
A. Only check leaf nodes for pairs
B. Ignore pairs where complement equals current node value
C. Use a sorted array instead of a hash set
D. Check if the complement equals the current node value and ensure the node appears twice

Solution

  1. Step 1: Understand the problem with duplicates

    If target is twice a node's value, we must ensure two distinct nodes with that value exist.
  2. Step 2: Modify algorithm to handle duplicates

    When complement equals current node value, check if the node appears twice (e.g., by counting occurrences or checking different nodes).
  3. Final Answer:

    Check if the complement equals the current node value and ensure the node appears twice -> Option D
  4. Quick Check:

    Handle duplicates by verifying two distinct nodes [OK]
Hint: Verify two distinct nodes if complement equals current value [OK]
Common Mistakes:
  • Ignoring duplicate values causing false positives
  • Skipping pairs with same node value
  • Switching data structures unnecessarily
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard