📖 Scenario: You are working with a Binary Search Tree (BST) that stores numbers. You want to find the inorder predecessor of a given node. The inorder predecessor is the node with the largest value smaller than the given node's value.This is useful in many real-world cases, like finding the previous event in a timeline or the closest smaller price in a sorted list.
🎯 Goal: Build a program that creates a BST, sets a target value, finds the inorder predecessor of the node with that value, and prints the predecessor's value.
📋 What You'll Learn
Create a BST with the exact nodes: 20, 10, 30, 5, 15, 25, 35
Create an integer variable target with the value 15
Write a method FindInorderPredecessor that finds the inorder predecessor of the node with value target
Print the value of the inorder predecessor node
💡 Why This Matters
🌍 Real World
Finding the inorder predecessor helps in tasks like scheduling, version control, and searching sorted data efficiently.
💼 Career
Understanding BST traversal and predecessor/successor logic is important for software engineering roles involving data structures and algorithms.
Progress0 / 4 steps
1
Create the BST nodes and build the tree
Create a class Node with integer Value and Left, Right child nodes. Then create the BST with nodes 20, 10, 30, 5, 15, 25, 35 linked correctly.
DSA C#
Hint
Start by defining the Node class with a constructor. Then create each node and link them to form the BST.
2
Set the target value to find the inorder predecessor for
Create an integer variable called target and set it to 15.
DSA C#
Hint
Just create a variable named target and assign it the value 15.
3
Write the method to find the inorder predecessor
Write a method FindInorderPredecessor that takes Node root and int target as parameters and returns the Node that is the inorder predecessor of the node with value target. Use the BST properties to find the predecessor.
DSA C#
Hint
Use a loop to traverse the tree. Move left if target is less or equal to current node's value. Otherwise, update predecessor and move right.
4
Print the inorder predecessor value
Call FindInorderPredecessor with root and target. Then print the predecessor's Value. If predecessor is null, print "No predecessor".
DSA C#
Hint
Call the method with root and target. Check if the result is null. Print the predecessor's value or "No predecessor" accordingly.
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
Step 1: Understand inorder traversal order
Inorder traversal visits nodes in ascending order for BST.
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.
Final Answer:
The node with the largest value smaller than the given node -> Option A
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
Step 1: Check where predecessor lies if left subtree exists
Predecessor is the rightmost node in the left subtree.
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.
Final Answer:
Node predecessor = node.Left; while (predecessor.Right != null) predecessor = predecessor.Right; -> Option D
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
Step 1: Locate node 15 and check left subtree
Node 15 has no left child, so predecessor is ancestor smaller than 15.
Step 2: Find nearest ancestor smaller than 15
Ancestor 10 is smaller than 15 and is the closest on the path.
Final Answer:
10 -> Option B
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
Step 1: Analyze left subtree traversal
Predecessor in left subtree is rightmost node, so loop should move right, not left.
Step 2: Identify incorrect loop condition
Current code loops while temp.Left != null, should be temp.Right != null to find rightmost node.
Final Answer:
The while loop should check temp.Right, not temp.Left -> Option A
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
Step 1: Check if node 25 has left subtree
Node 25 has no left child, so predecessor is ancestor smaller than 25.
Step 2: Find nearest ancestor smaller than 25
Ancestor 20 is smaller than 25 and closest on path from root to 25.
Final Answer:
20 -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.