Bird
Raised Fist0
DSA Cprogramming~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 Call
What is the output of the following C code that finds the inorder predecessor of a node with value 15 in the given BST?
DSA C
/* BST Node structure */
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* left;
    struct Node* right;
} Node;

Node* newNode(int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

Node* insert(Node* root, int data) {
    if (root == NULL) return newNode(data);
    if (data < root->data) root->left = insert(root->left, data);
    else root->right = insert(root->right, data);
    return root;
}

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

int main() {
    Node* root = NULL;
    int values[] = {20, 10, 30, 5, 15, 25, 35};
    for (int i = 0; i < 7; i++) {
        root = insert(root, values[i]);
    }
    Node node = {15, NULL, NULL};
    Node* pred = inorderPredecessor(root, &node);
    if (pred) printf("%d\n", pred->data);
    else printf("No predecessor\n");
    return 0;
}
ANo predecessor
B15
C5
D10
Attempts:
2 left
💡 Hint
Think about the largest value smaller than 15 in the BST.
🧠 Conceptual
intermediate
1:00remaining
Understanding Inorder Predecessor in BST
In a Binary Search Tree (BST), what does the inorder predecessor of a node represent?
AThe node with the largest value smaller than the given node
BThe node with the smallest value greater than the given node
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 Bug in Inorder Predecessor Function
What error will occur when running this code snippet to find the inorder predecessor of a node in a BST?
DSA C
Node* inorderPredecessor(Node* root, Node* node) {
    if (node->left != NULL) {
        Node* temp = node->left;
        while (temp->right != NULL) {
            temp = temp->right;
        }
        return temp;
    }
    Node* predecessor = NULL;
    while (root != NULL) {
        if (node->data < root->data) {
            root = root->left;
        } else if (node->data > root->data) {
            predecessor = root;
            root = root->right;
        } else {
            break;
        }
    }
    return predecessor;
}

int main() {
    Node* root = NULL;
    int values[] = {20, 10, 30, 5, 15, 25, 35};
    for (int i = 0; i < 7; i++) {
        root = insert(root, values[i]);
    }
    Node node = {40, NULL, NULL};
    Node* pred = inorderPredecessor(root, &node);
    if (pred) printf("%d\n", pred->data);
    else printf("No predecessor\n");
    return 0;
}
AInfinite loop in while loop
BReturns incorrect predecessor value
CSegmentation fault due to accessing NULL pointer
DCompilation error due to missing return statement
Attempts:
2 left
💡 Hint
Check what happens when the node is not present in the BST.
📝 Syntax
advanced
1:30remaining
Identify Syntax Error in Inorder Predecessor Code
Which option contains a syntax error in the implementation of the inorder predecessor function?
DSA C
Node* inorderPredecessor(Node* root, Node* node) {
    Node* predecessor = NULL;
    while (root != NULL) {
        if (node->data <= root->data) {
            root = root->left;
        } else {
            predecessor = root;
            root = root->right;
        }
    }
    return predecessor;
}
ANode* inorderPredecessor(Node* root, Node* node) { Node* predecessor = NULL; while (root != NULL) { if (node->data <= root->data) { root = root->left; } else { predecessor = root; root = root->right; } } return predecessor; }
B} ;rossecederp nruter } } ;thgir>-toor = toor ;toor = rossecederp { esle } ;tfel>-toor = toor { )atad>-toor =< atad>-edon( fi { )LLUN =! toor( elihw ;LLUN = rossecederp *edoN { )edon *edoN ,toor *edoN(rossecederPredroni *edoN
CNode* inorderPredecessor(Node* root, Node* node) { Node* predecessor = NULL; while (root != NULL) { if (node->data <= root->data) root = root->left; else { predecessor = root; root = root->right; } } return predecessor; }
Dode* inorderPredecessor(Node* root, Node* node) { Node* predecessor = NULL; while (root != NULL) { if (node->data <= root->data) { root = root->left; } else { predecessor = root; root = root->right; } } return predecessor; }
Attempts:
2 left
💡 Hint
Check the syntax of the if statement condition.
🚀 Application
expert
2:30remaining
Number of Nodes in Resulting BST After Inorder Predecessor Removal
Given a BST with nodes {20, 10, 30, 5, 15, 25, 35}, if you remove the inorder predecessor of node 20, how many nodes remain in the BST?
A7
B6
C5
D4
Attempts:
2 left
💡 Hint
Find the inorder predecessor of 20, then remove it and count remaining nodes.

Practice

(1/5)
1. What is the inorder predecessor of a node in a Binary Search Tree (BST)?
easy
A. The node with the largest value smaller than the given node
B. The node with the smallest value larger 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 A
  4. Quick Check:

    Inorder predecessor = largest smaller value [OK]
Hint: Predecessor is largest smaller value in BST [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 code snippets correctly finds the inorder predecessor of a given node node in a BST when the node has a left subtree?
easy
A. Node* pred = node->left; while (pred->right != NULL) pred = pred->right;
B. Node* pred = node->right; while (pred->left != NULL) pred = pred->left;
C. Node* pred = node->left; while (pred->left != NULL) pred = pred->left;
D. Node* pred = node->right; while (pred->right != NULL) pred = pred->right;

Solution

  1. Step 1: Identify inorder predecessor in left subtree

    If node has a left child, predecessor is the rightmost node in left subtree.
  2. Step 2: Trace code logic

    Starting from node->left, moving right until right child is NULL finds the rightmost node.
  3. Final Answer:

    Node* pred = node->left; while (pred->right != NULL) pred = pred->right; -> Option A
  4. Quick Check:

    Left subtree's rightmost node = predecessor [OK]
Hint: Go left once, then right as far as possible [OK]
Common Mistakes:
  • Going right subtree instead of left
  • Moving left repeatedly instead of right
  • Starting from node->right instead of node->left
3. Given the BST below and the node with value 15, what is its inorder predecessor?

        20
       /  \
     10    30
       \     \
       15    40
medium
A. 30
B. 15
C. 20
D. 10

Solution

  1. Step 1: Locate node 15 and check left subtree

    Node 15 has no left child, so predecessor is an ancestor smaller than 15.
  2. Step 2: Find nearest ancestor smaller than 15

    Ancestor 10 is smaller than 15 and is the closest on the path to root.
  3. Final Answer:

    10 -> Option D
  4. Quick Check:

    Predecessor of 15 is 10 [OK]
Hint: If no left child, go up to smaller ancestor [OK]
Common Mistakes:
  • Choosing node itself as predecessor
  • Choosing larger ancestor like 20
  • Confusing predecessor with successor
4. Consider this buggy C function to find the inorder predecessor of a node in a BST:

Node* inorderPredecessor(Node* root, Node* node) {
    if (node->left != NULL) {
        Node* pred = node->left;
        while (pred->left != NULL) {
            pred = pred->left;
        }
        return pred;
    }
    Node* pred = NULL;
    Node* ancestor = root;
    while (ancestor != node) {
        if (node->data > ancestor->data) {
            pred = ancestor;
            ancestor = ancestor->right;
        } else {
            ancestor = ancestor->left;
        }
    }
    return pred;
}
What is the main error in this code?
medium
A. The ancestor traversal is incorrect and may cause infinite loop
B. The function does not handle the case when node has no left subtree
C. The while loop should move right in left subtree, not left
D. The function returns NULL even if predecessor exists

Solution

  1. Step 1: Analyze left subtree traversal

    In left subtree, predecessor is rightmost node, so loop should move right, not left.
  2. Step 2: Check code loop

    Code incorrectly moves left repeatedly, so it finds leftmost node instead of rightmost.
  3. Final Answer:

    The while loop should move right in left subtree, not left -> Option C
  4. Quick Check:

    Left subtree traversal must go right for predecessor [OK]
Hint: In left subtree, go right to find predecessor [OK]
Common Mistakes:
  • Moving left instead of right in left subtree
  • Ignoring ancestor traversal logic
  • Assuming predecessor is always left child
5. You have a BST where each node has a pointer to its parent. Write the logic to find the inorder predecessor of a node node that has no left child. Which approach correctly finds the predecessor?
hard
A. Return the right child of the node's parent
B. Move up using parent pointers until you find a node which is right child of its parent; then return that parent
C. Move up using parent pointers until you find a node which is left child of its parent; then return that parent
D. Return the left child of the node's parent

Solution

  1. Step 1: Understand no left child case

    If node has no left child, predecessor is an ancestor where node is in right subtree.
  2. Step 2: Use parent pointers to find such ancestor

    Move up until current node is right child of its parent; that parent is predecessor.
  3. Final Answer:

    Move up using parent pointers until you find a node which is right child of its parent; then return that parent -> Option B
  4. Quick Check:

    Go up to right-child parent for predecessor [OK]
Hint: Go up until node is right child, then parent is predecessor [OK]
Common Mistakes:
  • Stopping at left child parent
  • Returning sibling nodes incorrectly
  • Assuming predecessor is always child node
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