📖 Scenario: You are managing a priority queue using a heap data structure. You want to remove the top element (minimum for min-heap or maximum for max-heap) and then restore the heap property by moving the new root element down the tree.
🎯 Goal: Build a Go program that extracts the root element from a heap and restores the heap property by bubbling down the new root element.
📋 What You'll Learn
Create a slice called heap with exact values representing a heap
Create a variable called heapSize to track the current size of the heap
Write a function bubbleDown that restores the heap property by moving the root element down
Extract the root element by replacing it with the last element and reducing heapSize
Print the heap slice after extraction and bubbling down
💡 Why This Matters
🌍 Real World
Heaps are used in priority queues, scheduling tasks, and algorithms like Dijkstra's shortest path.
💼 Career
Understanding heap extraction and bubble down is essential for roles involving algorithm optimization and system design.
Progress0 / 4 steps
1
Create the initial heap slice
Create a slice called heap with these exact integer values: 10, 15, 20, 17, 25. Also create an integer variable called heapSize and set it to 5.
DSA Go
Hint
Use heap := []int{10, 15, 20, 17, 25} and heapSize := 5.
2
Write the bubbleDown function
Write a function called bubbleDown that takes a slice of integers called heap and an integer heapSize. It should restore the min-heap property by moving the element at index 0 down the heap until it is smaller than its children or it reaches a leaf. Use variables index, leftChild, rightChild, and smallest inside the function.
DSA Go
Hint
Use a loop to compare the current element with its children and swap if needed.
3
Extract the root and call bubbleDown
Inside main, replace the root element heap[0] with the last element heap[heapSize-1], then decrease heapSize by 1. Then call bubbleDown(heap, heapSize) to restore the heap property.
DSA Go
Hint
Replace root with last element, reduce heapSize, then call bubbleDown.
4
Print the heap after extraction
Add a fmt.Println(heap[:heapSize]) statement at the end of main to print the heap slice after extraction and bubbling down.
DSA Go
Hint
Use fmt.Println(heap[:heapSize]) to print the current heap slice.
Practice
(1/5)
1. What is the main purpose of the bubble down operation in a min-heap after extracting the minimum element?
easy
A. To add a new element at the end of the heap
B. To restore the heap property by moving the root element down to its correct position
C. To swap the minimum element with the maximum element
D. To remove all leaf nodes from the heap
Solution
Step 1: Understand extract-min operation
When the minimum element (root) is removed, the last element is moved to the root.
Step 2: Apply bubble down to restore heap
The bubble down moves this element down the tree to restore the min-heap property.
Final Answer:
To restore the heap property by moving the root element down to its correct position -> Option B
Quick Check:
Bubble down fixes heap after extract-min [OK]
Hint: Bubble down fixes heap from root after removal [OK]
Common Mistakes:
Thinking bubble down adds elements
Confusing bubble down with bubble up
Believing bubble down swaps min and max
2. Which of the following Go code snippets correctly performs the bubble down operation for a min-heap starting at index i in slice heap?
easy
A. for {
left := 2*i + 1
right := 2*i + 2
smallest := i
if left < len(heap) && heap[left] < heap[smallest] {
smallest = left
}
if right < len(heap) && heap[right] < heap[smallest] {
smallest = right
}
if smallest == i {
break
}
heap[i], heap[smallest] = heap[smallest], heap[i]
i = smallest
}
B. for i < len(heap) {
left := 2*i
right := 2*i + 1
if heap[left] > heap[right] {
heap[i], heap[left] = heap[left], heap[i]
i = left
} else {
heap[i], heap[right] = heap[right], heap[i]
i = right
}
}
C. for i > 0 {
parent := (i - 1) / 2
if heap[i] < heap[parent] {
heap[i], heap[parent] = heap[parent], heap[i]
i = parent
} else {
break
}
}
D. for {
left := 2*i + 1
right := 2*i + 2
largest := i
if left < len(heap) && heap[left] > heap[largest] {
largest = left
}
if right < len(heap) && heap[right] > heap[largest] {
largest = right
}
if largest == i {
break
}
heap[i], heap[largest] = heap[largest], heap[i]
i = largest
}
Solution
Step 1: Identify bubble down for min-heap
Bubble down compares current node with children and swaps with smallest child.
Step 2: Check code correctness
for {
left := 2*i + 1
right := 2*i + 2
smallest := i
if left < len(heap) && heap[left] < heap[smallest] {
smallest = left
}
if right < len(heap) && heap[right] < heap[smallest] {
smallest = right
}
if smallest == i {
break
}
heap[i], heap[smallest] = heap[smallest], heap[i]
i = smallest
} correctly finds smallest child and swaps until heap property is restored.
Final Answer:
Option A code snippet correctly implements bubble down for min-heap -> Option A
Quick Check:
Min-heap bubble down uses smallest child swap [OK]
Hint: Bubble down swaps with smallest child in min-heap [OK]
Common Mistakes:
Using 1-based indexing instead of 0-based
Swapping with largest child in min-heap
Using bubble up logic instead of bubble down
3. Given the min-heap represented by the slice heap := []int{2, 4, 5, 10, 8, 15}, what will be the heap slice after extracting the minimum element and performing bubble down?
medium
A. [4, 8, 5, 10, 15]
B. [5, 4, 15, 10, 8]
C. [4, 10, 5, 15, 8]
D. [8, 4, 5, 10, 15]
Solution
Step 1: Remove min and replace root
Remove 2 (root), move last element 15 to root: [15,4,5,10,8]
Step 2: Bubble down 15
Compare 15 with children 4 and 5; swap with 4 (smallest). Now heap: [4,15,5,10,8]. Next, bubble down 15 at index 1: children 10 and 8; swap with 8 (smallest). Final heap: [4,8,5,10,15]
Final Answer:
[4, 8, 5, 10, 15] -> Option A
Quick Check:
Extract min + bubble down = [4,8,5,10,15] [OK]
Hint: Replace root with last, then swap down with smaller child [OK]
Common Mistakes:
Not swapping with smallest child first
Forgetting to move last element to root
Swapping with larger child
4. Consider the following Go code snippet for bubble down in a max-heap. Identify the bug that causes incorrect heap after extraction:
func bubbleDown(heap []int, i int) {
for {
left := 2*i + 1
right := 2*i + 2
largest := i
if left < len(heap) && heap[left] < heap[largest] {
largest = left
}
if right < len(heap) && heap[right] < heap[largest] {
largest = right
}
if largest == i {
break
}
heap[i], heap[largest] = heap[largest], heap[i]
i = largest
}
}
medium
A. The loop condition should be 'while i > 0' instead of infinite loop
B. The indices for left and right children are incorrect
C. Swapping elements should be done after the loop ends
D. The comparisons use '<' instead of '>' for max-heap
Solution
Step 1: Understand max-heap bubble down logic
In max-heap, bubble down swaps with the largest child, so comparisons should find the largest value.
Step 2: Identify incorrect comparison operators
The code uses '<' to find smaller child, which is wrong for max-heap; it should use '>' to find largest child.
Final Answer:
The comparisons use '<' instead of '>' for max-heap -> Option D
Quick Check:
Max-heap bubble down uses '>' comparisons [OK]
Hint: Max-heap bubble down compares with '>' not '<' [OK]
Common Mistakes:
Using wrong comparison operators for heap type
Incorrect child index calculations
Misplacing swap inside or outside loop
5. You have a max-heap represented as heap := []int{50, 30, 40, 10, 20, 35}. After extracting the maximum element and performing bubble down, what will be the resulting heap slice?
hard
A. [35, 30, 40, 10, 20]
B. [30, 20, 35, 10, 40]
C. [40, 30, 35, 10, 20]
D. [40, 30, 35, 20, 10]
Solution
Step 1: Remove max and replace root
Remove 50 (root), move last element 35 to root: [35,30,40,10,20]
Step 2: Bubble down 35
Compare 35 with children 30 and 40; swap with 40 (largest). Now heap: [40,30,35,10,20]. Next, bubble down 35 at index 2: children indices 5 and 6 do not exist (len=5), so stop. This restores the max-heap property.
Final Answer:
[40, 30, 35, 10, 20] -> Option C
Quick Check:
Extract max + bubble down = [40,30,35,10,20] [OK]
Hint: Swap with largest child repeatedly until heap property restored [OK]
Common Mistakes:
Not swapping with largest child first
Stopping bubble down too early
Ignoring heap property for children
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.