Skip to content

Commit 797ec26

Browse files
Heaps supports list, tuple and pydatastructs.Array (#218)
1 parent 781da91 commit 797ec26

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

pydatastructs/trees/heaps.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from pydatastructs.utils.misc_util import _check_type, NoneType, TreeNode, BinomialTreeNode
22
from pydatastructs.linear_data_structures.arrays import (ArrayForTrees,
3-
DynamicOneDimensionalArray)
3+
DynamicOneDimensionalArray, Array)
44
from pydatastructs.miscellaneous_data_structures.binomial_trees import BinomialTree
55

66
__all__ = [
@@ -24,9 +24,9 @@ class DHeap(Heap):
2424
Parameters
2525
==========
2626
27-
elements : list, tuple
27+
elements : list, tuple, Array
2828
Optional, by default 'None'.
29-
List/tuple of initial TreeNode in Heap.
29+
list/tuple/Array of initial TreeNode in Heap.
3030
3131
3232
heap_property : str
@@ -84,9 +84,12 @@ def __new__(cls, elements=None, heap_property="min", d=4):
8484
raise ValueError("%s is invalid heap property"%(heap_property))
8585
if elements is None:
8686
elements = DynamicOneDimensionalArray(TreeNode, 0)
87+
elif _check_type(elements, (list,tuple)):
88+
elements = DynamicOneDimensionalArray(TreeNode, len(elements), elements)
89+
elif _check_type(elements, Array):
90+
elements = DynamicOneDimensionalArray(TreeNode, len(elements), elements._data)
8791
else:
88-
if not all(map(lambda x: _check_type(x, TreeNode), elements)):
89-
raise ValueError("Expect a list/tuple of TreeNode got %s"%(elements))
92+
raise ValueError(f'Expected a list/tuple/Array of TreeNode got {type(elements)}')
9093
obj.heap = elements
9194
obj._last_pos_filled = obj.heap._last_pos_filled
9295
obj._build()
@@ -326,7 +329,7 @@ class BinomialHeap(Heap):
326329
Parameters
327330
==========
328331
329-
root_list: list/tuple
332+
root_list: list/tuple/Array
330333
By default, []
331334
The list of BinomialTree object references
332335
in sorted order.

pydatastructs/trees/tests/test_heaps.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_BinaryHeap():
4141
TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3),
4242
TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36)
4343
]
44-
min_heap = BinaryHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min")
44+
min_heap = BinaryHeap(elements=elements, heap_property="min")
4545
assert min_heap.extract().key == 1
4646

4747
expected_sorted_elements = [2, 3, 7, 17, 19, 25, 36, 100]
@@ -53,8 +53,19 @@ def test_BinaryHeap():
5353
TreeNode(1, 1), (2, 2), TreeNode(3, 3),
5454
TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36)
5555
]
56-
assert raises(ValueError, lambda:
56+
assert raises(TypeError, lambda:
57+
BinaryHeap(elements = non_TreeNode_elements, heap_property='min'))
58+
59+
non_TreeNode_elements = DynamicOneDimensionalArray(int, 0)
60+
non_TreeNode_elements.append(1)
61+
non_TreeNode_elements.append(2)
62+
assert raises(TypeError, lambda:
5763
BinaryHeap(elements = non_TreeNode_elements, heap_property='min'))
64+
65+
non_heapable = "[1, 2, 3]"
66+
assert raises(ValueError, lambda:
67+
BinaryHeap(elements = non_heapable, heap_property='min'))
68+
5869
def test_TernaryHeap():
5970
max_heap = TernaryHeap(heap_property="max")
6071
assert raises(IndexError, lambda: max_heap.extract())
@@ -86,7 +97,7 @@ def test_TernaryHeap():
8697
TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3),
8798
TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36)
8899
]
89-
min_heap = TernaryHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min")
100+
min_heap = TernaryHeap(elements=elements, heap_property="min")
90101
expected_extracted_element = min_heap.heap[0].key
91102
assert min_heap.extract().key == expected_extracted_element
92103

0 commit comments

Comments
 (0)