Bird
Raised Fist0
DSA C#programming~3 mins

Why BST Inorder Predecessor in DSA C#?

Choose your learning style10 modes available
The Big Idea

Discover how to find the 'just before' value in a tree without searching everywhere!

The Scenario

Imagine you have a family tree drawn on paper, and you want to find the person who comes just before someone in the family order. Without a clear method, you have to scan the whole tree again and again, which is tiring and confusing.

The Problem

Manually searching for the previous person means checking many family members one by one. This takes a lot of time and you can easily make mistakes by missing someone or going in the wrong direction.

The Solution

The BST Inorder Predecessor method gives you a clear path to find the person just before another in the family order. It uses the tree's structure to jump directly to the right spot, saving time and avoiding errors.

Before vs After
✗ Before
int FindPredecessor(Node root, int key) {
  List<int> inorder = new List<int>();
  InorderTraversal(root, inorder);
  for (int i = 1; i < inorder.Count; i++) {
    if (inorder[i] == key) return inorder[i - 1];
  }
  return -1;
}
✓ After
Node FindPredecessor(Node root, int key) {
  Node current = root;
  Node predecessor = null;
  while (current != null) {
    if (key > current.Value) {
      predecessor = current;
      current = current.Right;
    } else {
      current = current.Left;
    }
  }
  return predecessor;
}
What It Enables

This method lets you quickly find the closest smaller value in a sorted tree, making searches and updates much faster and easier.

Real Life Example

Think of a library catalog sorted by book IDs. If you want the book just before a certain ID, the BST Inorder Predecessor helps you find it instantly without flipping through every book.

Key Takeaways

Manual searching is slow and error-prone.

BST Inorder Predecessor uses tree structure for fast lookup.

It helps find the closest smaller value efficiently.

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 order

    Inorder traversal visits nodes in ascending order for BST.
  2. Step 2: Define predecessor in inorder traversal

    The predecessor is the node visited just before the current node, so it must have 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 node with a left subtree in a BST?
easy
A. Node predecessor = node.Left; while (predecessor.Left != null) predecessor = predecessor.Left;
B. Node predecessor = node.Right; while (predecessor.Left != null) predecessor = predecessor.Left;
C. Node predecessor = node.Right; while (predecessor.Right != null) predecessor = predecessor.Right;
D. Node predecessor = node.Left; while (predecessor.Right != null) predecessor = predecessor.Right;

Solution

  1. Step 1: Check where predecessor lies if left subtree exists

    Predecessor is the rightmost node in the left subtree.
  2. Step 2: Analyze code snippets

    Node predecessor = node.Left; while (predecessor.Right != null) predecessor = predecessor.Right; starts at left child and moves right until no more right child, correctly finding predecessor.
  3. Final Answer:

    Node predecessor = node.Left; while (predecessor.Right != null) predecessor = predecessor.Right; -> Option D
  4. Quick Check:

    Left subtree's rightmost node = predecessor [OK]
Hint: Go left once, then right as far as possible [OK]
Common Mistakes:
  • Going left repeatedly instead of right in left subtree
  • Starting from right child instead of left
  • Ignoring the while loop to find rightmost node
3. Given the BST below and the node with value 15, what is the inorder predecessor?
       20
      /  \
    10    30
      \
      15
medium
A. 30
B. 10
C. 20
D. 15

Solution

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

    Node 15 has no left child, so predecessor is 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.
  3. Final Answer:

    10 -> Option B
  4. Quick Check:

    Predecessor of 15 is 10 [OK]
Hint: If no left child, go up to smaller ancestor [OK]
Common Mistakes:
  • Choosing 20 which is larger than 15
  • Choosing 15 itself
  • Choosing 30 which is right subtree
4. Consider the following C# method to find the inorder predecessor of a node in a BST. What is the bug?
Node FindPredecessor(Node root, Node node) {
  if (node.Left != null) {
    Node temp = node.Left;
    while (temp.Left != null) {
      temp = temp.Left;
    }
    return temp;
  }
  Node predecessor = null;
  Node current = root;
  while (current != null) {
    if (node.Value > current.Value) {
      predecessor = current;
      current = current.Right;
    } else {
      current = current.Left;
    }
  }
  return predecessor;
}
medium
A. The while loop should check temp.Right, not temp.Left
B. The method does not handle null root
C. The method returns node itself as predecessor
D. The method incorrectly updates predecessor in the else block

Solution

  1. Step 1: Analyze left subtree traversal

    Predecessor in left subtree is rightmost node, so loop should move right, not left.
  2. Step 2: Identify incorrect loop condition

    Current code loops while temp.Left != null, should be temp.Right != null to find rightmost node.
  3. Final Answer:

    The while loop should check temp.Right, not temp.Left -> Option A
  4. Quick Check:

    Rightmost node in left subtree = predecessor [OK]
Hint: Go right in left subtree to find predecessor [OK]
Common Mistakes:
  • Checking left child repeatedly instead of right
  • Ignoring null root case (not critical here)
  • Confusing predecessor update logic
5. You want to find the inorder predecessor of a node with value 25 in the BST below:
        40
       /  \
     20    60
    /  \  /  \
  10  30 50  70
      /  
    25   
Which node is the inorder predecessor of 25?
hard
A. 30
B. 10
C. 20
D. 25 has no predecessor

Solution

  1. Step 1: Check if node 25 has left subtree

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

    Ancestor 20 is smaller than 25 and closest on path from root to 25.
  3. Final Answer:

    20 -> Option C
  4. Quick Check:

    Predecessor of 25 is 20 [OK]
Hint: If no left child, predecessor is nearest smaller ancestor [OK]
Common Mistakes:
  • Choosing 30 which is larger than 25
  • Choosing 10 which is smaller but not nearest ancestor
  • Thinking 25 has no predecessor
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