115 lines
2.8 KiB
Python
115 lines
2.8 KiB
Python
__author__ = 'Timothée DECOSTER'
|
|
__date_creation__ = 'Nov 15 18:37:07 2020'
|
|
__doc__ = """
|
|
:mod:`binary_tree` module
|
|
:author: {:s}
|
|
:creation date: {:s}
|
|
|
|
>>> t1 = BinaryTree()
|
|
>>> t1.is_empty()
|
|
True
|
|
>>> t2 = BinaryTree(1, t1, t1)
|
|
>>> t2.is_empty()
|
|
False
|
|
>>> t2.get_data()
|
|
1
|
|
>>> t2.get_left_subtree().is_empty()
|
|
True
|
|
>>> t2.get_right_subtree().is_empty()
|
|
True
|
|
>>> t2.is_leaf()
|
|
True
|
|
>>> print(t2)
|
|
(1, (), ())
|
|
""".format(__author__, __date_creation__)
|
|
|
|
|
|
class BinaryTreeError(Exception):
|
|
def __init__(self, msg):
|
|
self.message = msg
|
|
|
|
|
|
class BinaryTree():
|
|
def __init__(self, *args):
|
|
"""
|
|
Binarytree Constructor
|
|
|
|
:param args: any, BinaryTree , BinaryTree (optional) (Node, Left Child Tree, Right Child Tree )
|
|
"""
|
|
if len(args) == 0:
|
|
self.__content = None
|
|
elif len(args) != 3:
|
|
raise BinaryTreeError('bad arguments number for binary tree building')
|
|
elif not isinstance(args[1], BinaryTree) or not isinstance(args[2], BinaryTree):
|
|
raise BinaryTreeError('bad arguments type for binary tree building')
|
|
else:
|
|
self.__content = (args[0], args[1], args[2])
|
|
|
|
def is_empty(self):
|
|
"""
|
|
:return: (bool) True iff this tree is empty
|
|
"""
|
|
return self.__content is None
|
|
|
|
def get_data(self):
|
|
"""
|
|
:return: (any) Value saved in the root node
|
|
"""
|
|
try:
|
|
return self.__content[0]
|
|
except TypeError:
|
|
raise BinaryTreeError('empty tree has no root')
|
|
|
|
def get_left_subtree(self):
|
|
"""
|
|
:return: (BinaryTree) Left Child Subtree
|
|
"""
|
|
try:
|
|
return self.__content[1]
|
|
except TypeError:
|
|
raise BinaryTreeError('empty tree has no left subtree')
|
|
|
|
def get_right_subtree(self):
|
|
"""
|
|
:return: (BinaryTree) Right Child subtree
|
|
"""
|
|
try:
|
|
return self.__content[2]
|
|
except TypeError:
|
|
raise BinaryTreeError('empty tree has no right subtree')
|
|
|
|
def __str__(self):
|
|
"""
|
|
:return: (str) string representation of that tree
|
|
"""
|
|
if self.is_empty():
|
|
return '()'
|
|
else:
|
|
repr_left = str(self.get_left_subtree())
|
|
repr_right = str(self.get_right_subtree())
|
|
return '({:s}, {:s}, {:s})'.format(str(self.get_data()), repr_left, repr_right)
|
|
|
|
def size(self):
|
|
"""
|
|
:return: (int) numbre of Nodes in Tree
|
|
"""
|
|
pass
|
|
|
|
def height(self):
|
|
"""
|
|
:return: (int) height of that tree
|
|
"""
|
|
pass
|
|
|
|
def is_leaf(self):
|
|
"""
|
|
:return: (bool) True iff tree is a leaf
|
|
"""
|
|
pass
|
|
|
|
if __name__ == '__main__':
|
|
import doctest
|
|
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS, verbose=True)
|
|
|
|
|