forked from codezonediitj/pydatastructs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added M_aryTreeNode for use in M_ary tree and an implementation for M_ary Tree. The work is in reference with issue codezonediitj#101.
- Loading branch information
1 parent
93e7cc4
commit d77922a
Showing
3 changed files
with
218 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
from pydatastructs.utils import M_AryTreeNode, BinomialTreeNode | ||
from pydatastructs.linear_data_structures.arrays import ArrayForTrees | ||
|
||
__all__ = [ | ||
'M_AryTree' | ||
] | ||
|
||
class M_AryTree(object): | ||
""" | ||
Abstract m-ary tree. | ||
Parameters | ||
========== | ||
max_children | ||
Optional, specifies the maximum number of children | ||
a node can have. Defaults to 2 in case nothing is | ||
specified. | ||
root_data | ||
Optional, the root node of the binary tree. | ||
If not of type M_AryTreeNode, 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. | ||
References | ||
========== | ||
.. [1] https://en.wikipedia.org/wiki/M-ary_tree | ||
""" | ||
|
||
__slots__ = ['root_idx', 'max_children', 'comparator', 'tree', 'size', | ||
'is_order_statistic'] | ||
|
||
|
||
def __new__(cls, max_children=2, key=None, root_data=None, comp=None, | ||
is_order_statistic=False): | ||
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 = M_AryTreeNode(key, root_data) | ||
root.is_root = True | ||
obj.root_idx = 0 | ||
obj.max_children = max_children | ||
obj.tree, obj.size = ArrayForTrees(M_AryTreeNode, [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. | ||
balancing_info: bool | ||
Optional, by default, False | ||
The information needed for updating | ||
the tree is returned if this parameter | ||
is set to True. It is not meant for | ||
user facing APIs. | ||
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