-
Notifications
You must be signed in to change notification settings - Fork 272
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added implementation for M-ary tree (#140)
- Loading branch information
1 parent
5aeeff9
commit eadae21
Showing
4 changed files
with
214 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
from pydatastructs.utils import MAryTreeNode | ||
from pydatastructs.linear_data_structures.arrays import ArrayForTrees | ||
|
||
__all__ = [ | ||
'MAryTree' | ||
] | ||
|
||
class MAryTree(object): | ||
""" | ||
Abstract m-ary tree. | ||
Parameters | ||
========== | ||
root_data | ||
Optional, the root node of the binary tree. | ||
If not of type MAryTreeNode, it will consider | ||
root as data and a new root node will | ||
be created. | ||
key | ||
Required if tree is to be instantiated with | ||
root otherwise not needed. | ||
comp: lambda | ||
Optional, A lambda function which will be used | ||
for comparison of keys. Should return a | ||
bool value. By default it implements less | ||
than operator. | ||
is_order_statistic: bool | ||
Set it to True, if you want to use the | ||
order statistic features of the tree. | ||
max_children | ||
Optional, specifies the maximum number of children | ||
a node can have. Defaults to 2 in case nothing is | ||
specified. | ||
References | ||
========== | ||
.. [1] https://en.wikipedia.org/wiki/M-ary_tree | ||
""" | ||
|
||
__slots__ = ['root_idx', 'max_children', 'comparator', 'tree', 'size', | ||
'is_order_statistic'] | ||
|
||
|
||
def __new__(cls, key=None, root_data=None, comp=None, | ||
is_order_statistic=False, max_children=2): | ||
obj = object.__new__(cls) | ||
if key is None and root_data is not None: | ||
raise ValueError('Key required.') | ||
key = None if root_data is None else key | ||
root = MAryTreeNode(key, root_data) | ||
root.is_root = True | ||
obj.root_idx = 0 | ||
obj.max_children = max_children | ||
obj.tree, obj.size = ArrayForTrees(MAryTreeNode, [root]), 1 | ||
obj.comparator = lambda key1, key2: key1 < key2 \ | ||
if comp is None else comp | ||
obj.is_order_statistic = is_order_statistic | ||
return obj | ||
|
||
def insert(self, key, data): | ||
""" | ||
Inserts data by the passed key using iterative | ||
algorithm. | ||
Parameters | ||
========== | ||
key | ||
The key for comparison. | ||
data | ||
The data to be inserted. | ||
Returns | ||
======= | ||
None | ||
""" | ||
raise NotImplementedError("This is an abstract method.") | ||
|
||
def delete(self, key, **kwargs): | ||
""" | ||
Deletes the data with the passed key | ||
using iterative algorithm. | ||
Parameters | ||
========== | ||
key | ||
The key of the node which is | ||
to be deleted. | ||
Returns | ||
======= | ||
True | ||
If the node is deleted successfully. | ||
None | ||
If the node to be deleted doesn't exists. | ||
Note | ||
==== | ||
The node is deleted means that the connection to that | ||
node are removed but the it is still in tree. | ||
""" | ||
raise NotImplementedError("This is an abstract method.") | ||
|
||
def search(self, key, **kwargs): | ||
""" | ||
Searches for the data in the binary search tree | ||
using iterative algorithm. | ||
Parameters | ||
========== | ||
key | ||
The key for searching. | ||
parent: bool | ||
If true then returns index of the | ||
parent of the node with the passed | ||
key. | ||
By default, False | ||
Returns | ||
======= | ||
int | ||
If the node with the passed key is | ||
in the tree. | ||
tuple | ||
The index of the searched node and | ||
the index of the parent of that node. | ||
None | ||
In all other cases. | ||
""" | ||
raise NotImplementedError("This is an abstract method.") | ||
|
||
def to_binary_tree(self): | ||
""" | ||
Converts an m-ary tree to a binary tree. | ||
Returns | ||
======= | ||
TreeNode | ||
The root of the newly created binary tree. | ||
""" | ||
raise NotImplementedError("This is an abstract method.") | ||
|
||
|
||
def __str__(self): | ||
to_be_printed = ['' for i in range(self.tree._last_pos_filled + 1)] | ||
for i in range(self.tree._last_pos_filled + 1): | ||
if self.tree[i] is not None: | ||
node = self.tree[i] | ||
to_be_printed[i] = (node.key, node.data) | ||
for j in node.children: | ||
if j is not None: | ||
to_be_printed[i].append(j) | ||
return str(to_be_printed) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters