Bird
Raised Fist0
DSA Goprogramming~10 mins

Floor and Ceil in BST in DSA Go - Execution Trace

Choose your learning style10 modes available
Concept Flow - Floor and Ceil in BST
Start at root
↓
Compare key with node value
↓
Floor = Ceil = node value
→Done
↓
Go to left subtree
↓
Go to right subtree
↓
Repeat until leaf
↓
Return floor and ceil found
Start from the root and compare the key with current node's value. Move left if key is smaller, right if larger, updating floor or ceil candidates until reaching a leaf.
Execution Sample
DSA Go
func floorCeil(root *Node, key int) (floor, ceil int) {
    floor, ceil = -1, -1
    current := root
    for current != nil {
        if current.val == key {
            floor, ceil = current.val, current.val
            break
        } else if key < current.val {
            ceil = current.val
            current = current.left
        } else {
            floor = current.val
            current = current.right
        }
    }
    return
}
Find floor and ceil of a key in BST by traversing from root, updating floor and ceil candidates based on comparisons.
Execution Table
StepOperationCurrent Node ValueKeyFloorCeilPointer MoveVisual State
1Start at root2018-1-1Compare 18 < 20, move left20 / \ 10 30 / \ 5 15 40
2Move to left child1018-120Compare 18 > 10, floor=10, move right20 / \ 10 30 / \ 5 15 40
3Move to right child15181020Compare 18 > 15, floor=15, move right20 / \ 10 30 / \ 5 15 40
4Move to right childnil181520Reached leaf, stop20 / \ 10 30 / \ 5 15 40
ExitReturn floor and ceilnil181520DoneFloor=15, Ceil=20
💡 Reached leaf node (nil), no more nodes to check, return floor=15 and ceil=20
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
current.val20201015nilnil
floor-1-110151515
ceil-12020202020
Key Moments - 3 Insights
Why do we update floor only when key > current node value?
Because floor is the greatest value less than or equal to key. When key > current node, current node is a candidate floor. See execution_table rows 2 and 3 where floor updates to 10 and then 15.
Why do we update ceil only when key < current node value?
Because ceil is the smallest value greater than or equal to key. When key < current node, current node is a candidate ceil. See execution_table row 1 where ceil updates to 20.
What happens if key equals a node value?
Both floor and ceil are that node's value, and we stop searching immediately. This is shown in the code with the equality check and break.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at Step 3, what is the value of floor?
A10
B15
C20
D-1
💡 Hint
Check the 'Floor' column at Step 3 in execution_table
At which step does the pointer move to a nil node?
AStep 2
BStep 3
CStep 4
DExit
💡 Hint
Look at the 'Pointer Move' and 'Current Node Value' columns in execution_table
If the key was 30, what would be the floor and ceil after the first step?
AFloor = 20, Ceil = -1
BFloor = -1, Ceil = 20
CFloor = 20, Ceil = 30
DFloor = 30, Ceil = 30
💡 Hint
When key > current node value, floor updates; see variable_tracker and concept_flow
Concept Snapshot
Floor and Ceil in BST:
- Floor: greatest value ≤ key
- Ceil: smallest value ≥ key
- Start at root, compare key with node
- Move left if key < node (update ceil)
- Move right if key > node (update floor)
- Stop if key == node
- Return last floor and ceil found
Full Transcript
To find floor and ceil in a BST, start at the root node. Compare the key with the current node's value. If they are equal, floor and ceil are both that value. If the key is less than the node's value, update ceil to the node's value and move to the left child. If the key is greater, update floor to the node's value and move to the right child. Repeat this until you reach a leaf node. The last updated floor and ceil values are the answers. This process efficiently uses BST properties to find floor and ceil without checking all nodes.

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

  1. 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.
  2. 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.
  3. Final Answer:

    The greatest value in the BST less than or equal to the given value -> Option D
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    func ceil(root *Node, key int) int -> Option A
  4. 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

  1. 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.
  2. Step 2: Confirm returned ceil value

    Ceil is 15, the smallest value ≥ 14 in BST.
  3. Final Answer:

    15 -> Option A
  4. 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

  1. Step 1: Analyze floorVal condition

    The code checks if floorVal <= key, but floorVal can be -1 (no floor found). This causes wrong returns.
  2. 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.
  3. Final Answer:

    The condition 'floorVal <= key' should be 'floorVal != -1' -> Option B
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    Traverse once, update floor when node.val ≤ key, update ceil when node.val ≥ key -> Option C
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard