This notebook was prepared by Donne Martin. Source and license info is on GitHub.

Challenge Notebook

Problem: Implement a min heap with extract_min and insert methods.

Constraints

  • Can we assume the inputs are ints?
    • Yes
  • Can we assume this fits memory?
    • Yes

Test Cases

  • Extract min of an empty tree
  • Extract min general case
  • Insert into an empty tree
  • Insert general case (left and right insert)
          _5_
        /     \
       20     15
      / \    /  \
     22  40 25

extract_min(): 5

          _15_
        /      \
       20      25
      / \     /  \
     22  40 

insert(2):

          _2_
        /     \
       20      5
      / \     / \
     22  40  25  15

Algorithm

Refer to the Solution Notebook. If you are stuck and need a hint, the solution notebook's algorithm discussion might be a good place to start.

Code

In [ ]:
class MinHeap(object):

    def __init__(self):
        # TODO: Implement me
        pass

    def extract_min(self):
        # TODO: Implement me
        pass    

    def peek_min(self):
        # TODO: Implement me
        pass

    def insert(self, data):
        # TODO: Implement me
        pass

    def _bubble_up(self, index):
        # TODO: Implement me
        pass

Unit Test

The following unit test is expected to fail until you solve the challenge.

In [ ]:
# %load test_min_heap.py
import unittest


class TestMinHeap(unittest.TestCase):

    def test_min_heap(self):
        heap = MinHeap()
        self.assertEqual(heap.peek_min(), None)
        self.assertEqual(heap.extract_min(), None)
        heap.insert(20)
        self.assertEqual(heap.peek_min(), 20)
        heap.insert(5)
        self.assertEqual(heap.peek_min(), 5)
        heap.insert(15)
        heap.insert(22)
        heap.insert(40)
        heap.insert(5)
        self.assertEqual(heap.peek_min(), 5)
        heap.insert(3)
        self.assertEqual(heap.peek_min(), 3)
        self.assertEqual(heap.extract_min(), 3)
        self.assertEqual(heap.peek_min(), 5)
        print('Success: test_min_heap')

        
def main():
    test = TestMinHeap()
    test.test_min_heap()

    
if __name__ == '__main__':
    main()

Solution Notebook

Review the Solution Notebook for a discussion on algorithms and code solutions.