Heap

Heap data structure.

First we implement a max heap, then a min heap and finally combine them together to provide an unified heap struct.