11 template <
typename key_type,
typename value_type,
int max_degrees=20>
19 heap_node* children[max_degrees];
25 heap_node(
const key_type& _key,
const value_type&_value)
34 memset(children, 0,
sizeof(children));
52 heap_node* node = root_heap;
56 heap_node* next_node = node->right;
65 void insert(
const key_type& key,
const value_type& value)
67 heap_node* new_node =
new heap_node(key,value);
68 add_to_root_heap(new_node);
75 assert(min_heap != NULL);
78 value_type k = min_heap->value;
84 remove_node(min_heap);
97 return min_heap == NULL;
103 heap_node* root_heap;
107 void add_to_root_heap(heap_node* node)
110 if (root_heap == NULL)
118 node->right = root_heap;
119 root_heap->left = node;
123 if (node->key < min_heap->key )
133 heap_node* degree_nodes[max_degrees];
134 heap_node* node = root_heap;
136 memset(degree_nodes, 0,
sizeof(degree_nodes));
139 if (degree_nodes[node->degree] == NULL)
141 degree_nodes[node->degree] = node;
146 heap_node* pre_node = degree_nodes[node->degree];
148 if (node->key <pre_node->key)
150 attach_tree(pre_node, node);
154 attach_tree(node, pre_node);
158 memset(degree_nodes, 0,
sizeof(degree_nodes));
165 void attach_tree(heap_node* from_node, heap_node* to_node)
167 if (from_node == root_heap)
169 root_heap = root_heap->right;
173 if (from_node->left) from_node->left->right = from_node->right;
174 if (from_node->right) from_node->right->left = from_node->left;
175 from_node->left = NULL;
176 from_node->right = NULL;
179 to_node->children[ to_node->num_children ] = from_node;
180 from_node->parent = to_node;
181 to_node->num_children++;
186 void level_up(heap_node* node)
188 for (
int i = 0; i < node->num_children; i++)
190 heap_node* child_node = node->children[i];
192 add_to_root_heap(child_node);
193 child_node->parent = NULL;
194 node->children[i] = NULL;
197 node->num_children = 0;
201 void remove_node(heap_node* node)
203 if (node == NULL)
return;
205 if (node == root_heap)
207 root_heap = root_heap->right;
209 if (node->left) node->left->right = node->right;
210 if (node->right) node->right->left = node->left;
215 void assign_min_node()
217 heap_node* check_node = root_heap;
219 while (check_node != NULL)
221 if (min_heap == NULL || check_node->key < min_heap->key )
223 min_heap = check_node;
226 check_node = check_node->right;
231 void delete_tree(heap_node* node)
233 if (node == NULL)
return;
235 for (
int i = 0; i < node->num_children; i++)
237 heap_node* child_node = node->children[i];
238 delete_tree(child_node);