13template <
typename T,
typename Comparator = std::less < T > >
23 void insert (
const T & value );
48 Node(
const T & val,
unsigned deg = 0,
Node * par =
nullptr,
Node * chld =
nullptr,
Node * sib =
nullptr )
77template <
typename T,
typename Comparator >
79 deleteTreeList( m_head );
82template <
typename T,
typename Comparator >
84 while (head !=
nullptr) {
86 deleteTreeList( head->child );
92template <
typename T,
typename Comparator >
94 Node * newNode =
new Node( value, 0,
nullptr,
nullptr,
nullptr );
96 m_head = mergeHeaps( m_head, newNode );
101template<
typename T,
typename Comparator >
104 throw std::out_of_range (
"Heap is empty." );
106 Node * * ptrToMax = searchMax( &m_head );
109 *ptrToMax =
max->sibling;
111 Node * chlHead = reverseList(
max->child );
112 m_head = mergeHeaps( this->m_head, chlHead );
115 T maxVal =
max->value;
120template <
typename T,
typename Comparator >
122 if (this->m_comparator != that.m_comparator)
123 throw std::logic_error(
"compare functions aren't equal, unable to merge");
125 this->m_head = mergeHeaps( this->m_head, that.m_head );
126 that.m_head =
nullptr;
128 this->m_size += that.m_size;
132template <
typename T,
typename Comparator >
134 Node *
max = *head, * * ptrToMax = head;
135 for (
Node * actual = * head, * prev =
nullptr; actual !=
nullptr; prev = actual, actual = actual->
sibling) {
136 if ( m_comparator (
max->value, actual->value ) ) {
138 ptrToMax = &prev->sibling;
144template <
typename T,
typename Comparator >
152 head1 = mergeListsByDeg( head1, head2 );
154 Node * actual = head1;
155 Node * * toLink = & head1;
162 }
else if ( ! m_comparator ( actual->
value, next->
value ) ) {
164 actual = linkTreeToTree( next, actual );
167 actual = linkTreeToTree( actual, next );
174template <
typename T,
typename Comparator >
176 Node * newHead =
nullptr;
177 Node * * toLink = &newHead;
178 while (head1 && head2) {
197template <
typename T,
typename Comparator >
199 Node * prev =
nullptr;
211template <
typename T,
typename Comparator >
215 root2->
child = root1;
Definition: BinomialHeap.h:14
size_t m_size
Definition: BinomialHeap.h:53
Node * mergeListsByDeg(Node *head1, Node *head2)
Definition: BinomialHeap.h:175
Node ** searchMax(Node **head) const
Definition: BinomialHeap.h:133
BinomialHeap(Comparator comparator=Comparator())
Definition: BinomialHeap.h:17
Comparator m_comparator
Definition: BinomialHeap.h:54
Node * m_head
Definition: BinomialHeap.h:52
T extractMax()
Definition: BinomialHeap.h:102
void deleteTreeList(Node *head)
Definition: BinomialHeap.h:83
Node * mergeHeaps(Node *head1, Node *head2)
Definition: BinomialHeap.h:145
void insert(const T &value)
Definition: BinomialHeap.h:93
size_t size() const
Definition: BinomialHeap.h:36
Node * linkTreeToTree(Node *root1, Node *root2)
Definition: BinomialHeap.h:212
Node * reverseList(Node *head)
Definition: BinomialHeap.h:198
void mergeWith(BinomialHeap< T, Comparator > &&that)
Definition: BinomialHeap.h:121
const T & getMax() const
Definition: BinomialHeap.h:26
~BinomialHeap()
Definition: BinomialHeap.h:78
Definition: ExceptionHandler.cpp:13
constexpr const T & max(const T &a)
Root case of maximum computation. The maximum from one value is the value itself.
Definition: algorithm.hpp:278
Definition: BinomialHeap.h:42
Node * parent
Definition: BinomialHeap.h:45
Node * child
Definition: BinomialHeap.h:46
Node(const T &val, unsigned deg=0, Node *par=nullptr, Node *chld=nullptr, Node *sib=nullptr)
Definition: BinomialHeap.h:48
T value
Definition: BinomialHeap.h:43
unsigned degree
Definition: BinomialHeap.h:44
Node * sibling
Definition: BinomialHeap.h:47