1
- # flake8: noqa
2
-
3
1
"""
4
2
Binomial Heap
5
3
Reference: Advanced Data Structures, Peter Brass
@@ -22,7 +20,7 @@ def __init__(self, val):
22
20
self .right = None
23
21
self .parent = None
24
22
25
- def mergeTrees (self , other ):
23
+ def merge_trees (self , other ):
26
24
"""
27
25
In-place merge of two binomial trees of equal size.
28
26
Returns the root of the resulting tree
@@ -75,9 +73,8 @@ class BinomialHeap:
75
73
30
76
74
77
75
Deleting - delete() test
78
- >>> for i in range(25):
79
- ... print(first_heap.deleteMin(), end=" ")
80
- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
76
+ >>> [first_heap.delete_min() for _ in range(20)]
77
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
81
78
82
79
Create a new Heap
83
80
>>> second_heap = BinomialHeap()
@@ -97,8 +94,8 @@ class BinomialHeap:
97
94
# # # #
98
95
99
96
preOrder() test
100
- >>> second_heap.preOrder( )
101
- [ (17, 0), ('#', 1), (31, 1), (20, 2), ('#', 3), ('#', 3), (34, 2), ('#', 3), ('#', 3)]
97
+ >>> " ".join(str(x) for x in second_heap.pre_order() )
98
+ " (17, 0) ('#', 1) (31, 1) (20, 2) ('#', 3) ('#', 3) (34, 2) ('#', 3) ('#', 3)"
102
99
103
100
printing Heap - __str__() test
104
101
>>> print(second_heap)
@@ -113,22 +110,25 @@ class BinomialHeap:
113
110
---#
114
111
115
112
mergeHeaps() test
116
- >>> merged = second_heap.mergeHeaps(first_heap)
113
+ >>>
114
+ >>> merged = second_heap.merge_heaps(first_heap)
117
115
>>> merged.peek()
118
116
17
119
117
120
118
values in merged heap; (merge is inplace)
121
- >>> while not first_heap.isEmpty():
122
- ... print(first_heap.deleteMin(), end=" ")
123
- 17 20 25 26 27 28 29 31 34
119
+ >>> results = []
120
+ >>> while not first_heap.is_empty():
121
+ ... results.append(first_heap.delete_min())
122
+ >>> results
123
+ [17, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 34]
124
124
"""
125
125
126
126
def __init__ (self , bottom_root = None , min_node = None , heap_size = 0 ):
127
127
self .size = heap_size
128
128
self .bottom_root = bottom_root
129
129
self .min_node = min_node
130
130
131
- def mergeHeaps (self , other ):
131
+ def merge_heaps (self , other ):
132
132
"""
133
133
In-place merge of two binomial heaps.
134
134
Both of them become the resulting merged heap
@@ -180,7 +180,7 @@ def mergeHeaps(self, other):
180
180
next_node = i .parent .parent
181
181
182
182
# Merging trees
183
- i = i .mergeTrees (i .parent )
183
+ i = i .merge_trees (i .parent )
184
184
185
185
# Updating links
186
186
i .left = previous_node
@@ -238,7 +238,7 @@ def insert(self, val):
238
238
next_node = self .bottom_root .parent .parent
239
239
240
240
# Merge
241
- self .bottom_root = self .bottom_root .mergeTrees (self .bottom_root .parent )
241
+ self .bottom_root = self .bottom_root .merge_trees (self .bottom_root .parent )
242
242
243
243
# Update Links
244
244
self .bottom_root .parent = next_node
@@ -252,10 +252,10 @@ def peek(self):
252
252
"""
253
253
return self .min_node .val
254
254
255
- def isEmpty (self ):
255
+ def is_empty (self ):
256
256
return self .size == 0
257
257
258
- def deleteMin (self ):
258
+ def delete_min (self ):
259
259
"""
260
260
delete min element and return it
261
261
"""
@@ -317,7 +317,7 @@ def deleteMin(self):
317
317
return min_value
318
318
# Remaining cases
319
319
# Construct heap of right subtree
320
- newHeap = BinomialHeap (
320
+ new_heap = BinomialHeap (
321
321
bottom_root = bottom_of_new , min_node = min_of_new , heap_size = size_of_new
322
322
)
323
323
@@ -354,11 +354,11 @@ def deleteMin(self):
354
354
self .min_node = i
355
355
i = i .parent
356
356
# Merge heaps
357
- self .mergeHeaps ( newHeap )
357
+ self .merge_heaps ( new_heap )
358
358
359
359
return min_value
360
360
361
- def preOrder (self ):
361
+ def pre_order (self ):
362
362
"""
363
363
Returns the Pre-order representation of the heap including
364
364
values of nodes plus their level distance from the root;
@@ -369,9 +369,9 @@ def preOrder(self):
369
369
while top_root .parent :
370
370
top_root = top_root .parent
371
371
# preorder
372
- heap_preOrder = []
373
- self .__traversal (top_root , heap_preOrder )
374
- return heap_preOrder
372
+ heap_pre_order = []
373
+ self .__traversal (top_root , heap_pre_order )
374
+ return heap_pre_order
375
375
376
376
def __traversal (self , curr_node , preorder , level = 0 ):
377
377
"""
@@ -389,9 +389,9 @@ def __str__(self):
389
389
Overwriting str for a pre-order print of nodes in heap;
390
390
Performance is poor, so use only for small examples
391
391
"""
392
- if self .isEmpty ():
392
+ if self .is_empty ():
393
393
return ""
394
- preorder_heap = self .preOrder ()
394
+ preorder_heap = self .pre_order ()
395
395
396
396
return "\n " .join (("-" * level + str (value )) for value , level in preorder_heap )
397
397
0 commit comments