Bird
Raised Fist0
DSA C++programming~20 mins

BST Inorder Predecessor in DSA C++ - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
BST Inorder Predecessor Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Inorder Predecessor Function in BST
What is the output of the following C++ code that finds the inorder predecessor of a given node in a BST?
DSA C++
struct Node {
    int data;
    Node* left;
    Node* right;
};

Node* inorderPredecessor(Node* root, Node* p) {
    Node* predecessor = nullptr;
    while (root) {
        if (p->data <= root->data) {
            root = root->left;
        } else {
            predecessor = root;
            root = root->right;
        }
    }
    return predecessor;
}

int main() {
    Node n1{20, nullptr, nullptr};
    Node n2{10, nullptr, nullptr};
    Node n3{30, nullptr, nullptr};
    Node n4{5, nullptr, nullptr};
    Node n5{15, nullptr, nullptr};

    n1.left = &n2; n1.right = &n3;
    n2.left = &n4; n2.right = &n5;

    Node* pred = inorderPredecessor(&n1, &n5);
    if (pred) {
        std::cout << pred->data << std::endl;
    } else {
        std::cout << "No predecessor" << std::endl;
    }
    return 0;
}
A20
B15
C10
DNo predecessor
Attempts:
2 left
💡 Hint
Think about the largest value smaller than the node 15 in the BST.
🧠 Conceptual
intermediate
1:30remaining
Understanding Inorder Predecessor in BST
In a Binary Search Tree (BST), which of the following best describes the inorder predecessor of a node?
AThe node with the largest value smaller than the given node's value
BThe node with the smallest value larger than the given node's value
CThe left child of the given node
DThe right child of the given node
Attempts:
2 left
💡 Hint
Inorder traversal visits nodes in ascending order.
🔧 Debug
advanced
2:00remaining
Identify the Error in Inorder Predecessor Code
What error does the following C++ code produce when trying to find the inorder predecessor of a node in a BST?
DSA C++
Node* inorderPredecessor(Node* root, Node* p) {
    if (!root) return nullptr;
    if (p->left) {
        Node* temp = p->left;
        while (temp->right) temp = temp->right;
        return temp;
    }
    Node* predecessor = nullptr;
    while (root) {
        if (p->data < root->data) {
            root = root->left;
        } else if (p->data > root->data) {
            predecessor = root;
            root = root->right;
        }
    }
    return predecessor;
}

// Called with p = nullptr
ANo error, returns nullptr
BCompilation error due to missing return statement
CInfinite loop in while loop
DSegmentation fault due to dereferencing nullptr
Attempts:
2 left
💡 Hint
Check what happens if p is nullptr.
❓ Predict Output
advanced
2:00remaining
Output of Inorder Predecessor for Root Node
What is the output of the following code when finding the inorder predecessor of the root node in a BST?
DSA C++
struct Node {
    int data;
    Node* left;
    Node* right;
};

Node* inorderPredecessor(Node* root, Node* p) {
    if (p->left) {
        Node* temp = p->left;
        while (temp->right) temp = temp->right;
        return temp;
    }
    Node* predecessor = nullptr;
    while (root) {
        if (p->data <= root->data) {
            root = root->left;
        } else {
            predecessor = root;
            root = root->right;
        }
    }
    return predecessor;
}

int main() {
    Node n1{20, nullptr, nullptr};
    Node n2{10, nullptr, nullptr};
    Node n3{30, nullptr, nullptr};
    n1.left = &n2; n1.right = &n3;

    Node* pred = inorderPredecessor(&n1, &n1);
    if (pred) {
        std::cout << pred->data << std::endl;
    } else {
        std::cout << "No predecessor" << std::endl;
    }
    return 0;
}
A30
B10
CNo predecessor
D20
Attempts:
2 left
💡 Hint
Check if root has a left subtree and find its rightmost node.
🚀 Application
expert
2:30remaining
Number of Nodes with Inorder Predecessor in BST
Given a BST with nodes 5, 10, 15, 20, 25 inserted in that order, how many nodes have a valid inorder predecessor?
A4
B5
C3
D2
Attempts:
2 left
💡 Hint
The smallest node has no predecessor.

Practice

(1/5)
1. What is the inorder predecessor of a node in a Binary Search Tree (BST)?
easy
A. The node with the smallest value larger than the given node
B. The node with the largest value smaller than the given node
C. The left child of the given node
D. The right child of the given node

Solution

  1. Step 1: Understand inorder traversal in BST

    Inorder traversal visits nodes in ascending order of their values.
  2. Step 2: Define inorder predecessor

    The inorder predecessor of a node is the node visited just before it in inorder traversal, which means it has the largest value smaller than the current node.
  3. Final Answer:

    The node with the largest value smaller than the given node -> Option B
  4. Quick Check:

    Inorder predecessor = largest smaller value [OK]
Hint: Predecessor is just before in sorted order [OK]
Common Mistakes:
  • Confusing predecessor with successor
  • Thinking predecessor is always left child
  • Assuming predecessor is the parent node
2. Which of the following C++ function signatures correctly represents a function to find the inorder predecessor of a BST node given its pointer Node* root and Node* target?
easy
A. Node* findInorderPredecessor(Node* root, Node* target);
B. void findInorderPredecessor(Node* root, int target);
C. int findInorderPredecessor(Node* root, Node* target);
D. Node findInorderPredecessor(Node root, Node target);

Solution

  1. Step 1: Analyze parameter types

    The function needs the root pointer and the target node pointer to find the predecessor.
  2. Step 2: Analyze return type

    The predecessor is a node pointer, so return type should be Node*.
  3. Final Answer:

    Node* findInorderPredecessor(Node* root, Node* target); -> Option A
  4. Quick Check:

    Correct parameters and return type [OK]
Hint: Return pointer to predecessor node [OK]
Common Mistakes:
  • Using int return type instead of Node*
  • Passing target as int instead of Node*
  • Passing nodes by value instead of pointer
3. Consider the following BST and code snippet to find the inorder predecessor of node with value 15:
struct Node {
  int val;
  Node* left;
  Node* right;
};

Node* findMax(Node* root) {
  while (root->right) root = root->right;
  return root;
}

Node* inorderPredecessor(Node* root, Node* target) {
  if (target->left) return findMax(target->left);
  Node* predecessor = nullptr;
  while (root) {
    if (target->val > root->val) {
      predecessor = root;
      root = root->right;
    } else if (target->val < root->val) {
      root = root->left;
    } else break;
  }
  return predecessor;
}

// BST structure:
//        20
//       /  \
//     10    30
//       \     \
//       15    40

Node* root = ...; // root of above BST
Node* target = root->left->right; // node with value 15
Node* pred = inorderPredecessor(root, target);
std::cout << pred->val << std::endl;
What is the output?
medium
A. 10
B. 15
C. 20
D. 30

Solution

  1. Step 1: Check if target has left subtree

    Node 15 has no left child, so we skip findMax on left subtree.
  2. Step 2: Traverse from root to find predecessor

    Start at root (20). Since 15 < 20, go left to 10. Since 15 > 10, set predecessor = 10 and go right to 15. Found target, stop.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Largest smaller value than 15 is 10 [OK]
Hint: If no left child, track last smaller ancestor [OK]
Common Mistakes:
  • Returning target node itself
  • Returning root node 20 incorrectly
  • Confusing predecessor with successor
4. The following code attempts to find the inorder predecessor of a node in a BST but has a bug. Identify the bug.
Node* inorderPredecessor(Node* root, Node* target) {
  if (target->left) {
    Node* temp = target->left;
    while (temp->left) temp = temp->left;
    return temp;
  }
  Node* predecessor = nullptr;
  while (root) {
    if (target->val > root->val) {
      predecessor = root;
      root = root->right;
    } else if (target->val < root->val) {
      root = root->left;
    } else break;
  }
  return predecessor;
}
medium
A. The predecessor variable is not initialized
B. The function does not handle the case when target has no left subtree
C. The function returns nullptr always
D. The loop to find max in left subtree incorrectly goes left instead of right

Solution

  1. Step 1: Check left subtree max search

    To find inorder predecessor in left subtree, we must find the maximum node, which is the rightmost node, but code goes left repeatedly.
  2. Step 2: Confirm other parts are correct

    The rest of the code correctly handles cases without left subtree and initializes predecessor.
  3. Final Answer:

    The loop to find max in left subtree incorrectly goes left instead of right -> Option D
  4. Quick Check:

    Max in left subtree requires right traversal [OK]
Hint: Max in left subtree means go right, not left [OK]
Common Mistakes:
  • Going left instead of right to find max
  • Not checking if target->left is null
  • Confusing predecessor with successor
5. Given a BST with nodes inserted in this order: 25, 15, 50, 10, 22, 35, 70, 4, 12, 18, 24, 31, 44, 66, 90. Write a function to find the inorder predecessor of a node with value 31. What will be the predecessor's value? Hint: Use the BST property and consider both cases when the node has a left subtree or not.
hard
A. 25
B. 35
C. 24
D. 22

Solution

  1. Step 1: Locate node 31

    Node 31 is the left child of 35 and has no left subtree.
  2. Step 2: Traverse from root to find predecessor

    Start at root 25 (31 > 25, predecessor=25, go right to 50). 31 < 50, go left to 35. 31 < 35, go left to 31. Found target, predecessor=25.
  3. Step 3: Verify with inorder traversal

    Inorder traversal sequence around 31 is ... 24, 25, 31, 35 ... The predecessor of 31 is the largest smaller value, which is 24 (left subtree of 25).
  4. Final Answer:

    24 -> Option C
  5. Quick Check:

    Inorder predecessor of 31 is 24 [OK]
Hint: If no left child, predecessor is last smaller ancestor or max in left subtree [OK]
Common Mistakes:
  • Choosing 25 instead of 24
  • Choosing successor 35 instead of predecessor
  • Ignoring left subtree check
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