📖 Scenario: You are working with a Binary Search Tree (BST) that stores integer values. You want to find the floor and ceil values for a given number in the BST. The floor is the greatest value in the BST less than or equal to the given number. The ceil is the smallest value in the BST greater than or equal to the given number.This is useful in many real-world cases like finding closest available prices, dates, or scores.
🎯 Goal: Build a Go program that creates a BST, sets a target number, finds the floor and ceil values for that number in the BST, and prints the results.
📋 What You'll Learn
Create a BST with exact nodes: 20, 10, 30, 5, 15, 25, 35
Set a target number variable called target with value 16
Implement functions floorBST and ceilBST to find floor and ceil values
Print the floor and ceil values for the target number
💡 Why This Matters
🌍 Real World
Finding floor and ceil values in a BST is useful in applications like price matching, scheduling, and range queries where you want closest available values.
💼 Career
Understanding BST operations and floor/ceil logic is important for software engineers working on search engines, databases, and real-time systems.
Progress0 / 4 steps
1
Create the BST structure and insert nodes
Create a struct called Node with data int, left *Node, and right *Node. Then create a function insert that takes a *Node and an int and returns a *Node. Insert these exact values into the BST in this order: 20, 10, 30, 5, 15, 25, 35. Store the root in a variable called root.
DSA Go
Hint
Define the Node struct with data, left, and right pointers. Use recursion in insert to place values correctly.
2
Set the target number to find floor and ceil
Create an integer variable called target and set it to 16.
DSA Go
Hint
Use target := 16 to create and set the variable.
3
Implement floorBST and ceilBST functions
Write two functions: floorBST and ceilBST. Each takes root *Node and target int and returns an int. floorBST returns the greatest value less than or equal to target in the BST or -1 if none. ceilBST returns the smallest value greater than or equal to target or -1 if none.
DSA Go
Hint
Use a loop to traverse the BST. Update floor when current node is less than target. Update ceil when current node is greater than target.
4
Print the floor and ceil values for the target
Print the floor value using floorBST(root, target) and the ceil value using ceilBST(root, target) with the exact format: Floor: X Ceil: Y where X and Y are the floor and ceil values respectively.
DSA Go
Hint
Use fmt.Printf("Floor: %d\n", floorBST(root, target)) and similarly for ceil.
Practice
(1/5)
1. What does the floor of a value in a Binary Search Tree (BST) represent?
easy
A. The smallest value in the BST less than the given value
B. The smallest value in the BST greater than or equal to the given value
C. The root value of the BST
D. The greatest value in the BST less than or equal to the given value
Solution
Step 1: Understand the floor concept in BST
The floor of a value is the largest value in the BST that is less than or equal to the given value.
Step 2: Compare with options
The greatest value in the BST less than or equal to the given value matches this definition exactly, while others describe different concepts.
Final Answer:
The greatest value in the BST less than or equal to the given value -> Option D
Quick Check:
Floor = greatest ≤ value [OK]
Hint: Floor is largest ≤ value in BST [OK]
Common Mistakes:
Confusing floor with ceil
Thinking floor is smallest value
Assuming floor is always root
2. Which of the following Go function signatures correctly represents a function to find the ceil in a BST for an integer key?
easy
A. func ceil(root *Node, key int) int
B. func ceil(key int, root *Node) int
C. func ceil(root Node, key int) int
D. func ceil(root *Node, key string) int
Solution
Step 1: Check parameter order and types
The function should take a pointer to the root node and an integer key to search for ceil.
Step 2: Validate options
func ceil(root *Node, key int) int uses pointer to Node and int key in correct order. Swapping parameters to key first is wrong, using value Node instead of pointer is wrong, using string for key is wrong.
Final Answer:
func ceil(root *Node, key int) int -> Option A
Quick Check:
Pointer root and int key correct [OK]
Hint: Pointer root first, key int second [OK]
Common Mistakes:
Swapping parameter order
Using value instead of pointer for root
Wrong key data type
3. Given the BST below and key = 14, what is the ceil value returned by the following Go code?
type Node struct {
val int
left, right *Node
}
func ceil(root *Node, key int) int {
if root == nil {
return -1
}
if root.val == key {
return root.val
}
if root.val < key {
return ceil(root.right, key)
}
ceilVal := ceil(root.left, key)
if ceilVal >= key && ceilVal != -1 {
return ceilVal
}
return root.val
}
// BST structure:
// 10
// / \
// 5 15
// / \
// 12 20
// Call: ceil(root, 14)
medium
A. 15
B. 12
C. 20
D. -1
Solution
Step 1: Trace ceil function with key=14
Start at root 10: 10 < 14, go right to 15. 15 > 14, check left subtree of 15 (12). 12 < 14, so ceil(12) returns -1, so return 15.
Step 2: Confirm returned ceil value
Ceil is 15, the smallest value ≥ 14 in BST.
Final Answer:
15 -> Option A
Quick Check:
Ceil(14) = 15 [OK]
Hint: Ceil is smallest ≥ key, check right if less [OK]
Common Mistakes:
Returning 12 instead of 15
Returning -1 when ceil exists
Confusing floor and ceil logic
4. The following Go code attempts to find the floor in a BST but returns incorrect results. What is the bug?
func floor(root *Node, key int) int {
if root == nil {
return -1
}
if root.val == key {
return root.val
}
if root.val > key {
return floor(root.left, key)
}
floorVal := floor(root.right, key)
if floorVal <= key {
return floorVal
}
return root.val
}
medium
A. The function should check 'floorVal >= key' instead
B. The condition 'floorVal <= key' should be 'floorVal != -1'
C. The base case should return 0 instead of -1
D. The recursive call on left subtree is incorrect
Solution
Step 1: Analyze floorVal condition
The code checks if floorVal <= key, but floorVal can be -1 (no floor found). This causes wrong returns.
Step 2: Correct condition for valid floorVal
It should check if floorVal != -1 to confirm a valid floor before returning it; otherwise return root.val.
Final Answer:
The condition 'floorVal <= key' should be 'floorVal != -1' -> Option B
Quick Check:
Check floorVal != -1 before return [OK]
Hint: Check for -1 (no floor) before returning floorVal [OK]
Common Mistakes:
Ignoring -1 as invalid floor
Wrong comparison operators
Changing base case return value
5. You have a BST with nodes: 8, 4, 12, 2, 6, 10, 14. You want to find both floor and ceil for key = 5 using a single traversal function. Which approach is best to implement this efficiently?
hard
A. Use inorder traversal and store all nodes in array, then binary search
B. Traverse left subtree for floor, right subtree for ceil separately
C. Traverse once, update floor when node.val ≤ key, update ceil when node.val ≥ key
D. Find floor first, then restart traversal to find ceil
Solution
Step 1: Understand single traversal for floor and ceil
During one traversal, compare node values with key. Update floor if node.val ≤ key and is greater than current floor. Update ceil if node.val ≥ key and is less than current ceil.
Step 2: Compare approaches
Traverse once, update floor when node.val ≤ key, update ceil when node.val ≥ key efficiently finds both in one pass. Options B and C require multiple traversals. Use inorder traversal and store all nodes in array, then binary search uses extra space and is less efficient.
Final Answer:
Traverse once, update floor when node.val ≤ key, update ceil when node.val ≥ key -> Option C
Quick Check:
Single pass update floor & ceil [OK]
Hint: Update floor and ceil in one BST traversal [OK]
Common Mistakes:
Doing separate traversals for floor and ceil
Using extra space unnecessarily
Restarting traversal multiple times
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.