114 lines
2.9 KiB
Python
114 lines
2.9 KiB
Python
|
|
import treelib
|
|
|
|
class Node():
|
|
|
|
def __init__(self, val):
|
|
self.val = val
|
|
self.right = None
|
|
self.left = None
|
|
|
|
class BinaryTree():
|
|
|
|
def __init__(self, root):
|
|
self.root = root
|
|
|
|
def insert_callable(self, val):
|
|
self.root = self.__insert(val, self.root)
|
|
|
|
def __insert(self, val, node):
|
|
if not node:
|
|
node = Node(val)
|
|
return node
|
|
elif val < node.val:
|
|
node.left = self.__insert(val, node.left)
|
|
return node
|
|
elif val > node.val:
|
|
node.right = self.__insert(val, node.right)
|
|
return node
|
|
else:
|
|
raise Exception('This element already exist!')
|
|
|
|
def search_callable(self, val):
|
|
return self.__search(val, self.root)
|
|
|
|
def set_less(self, node_left, node_right):
|
|
|
|
if not node_right:
|
|
return node_left
|
|
else:
|
|
node_right.left = self.set_less(node_left, node_right.left)
|
|
return node_right
|
|
|
|
def __search(self, val, node):
|
|
|
|
if not node:
|
|
return False
|
|
elif node.val == val:
|
|
return True
|
|
elif val < node.val:
|
|
return self.__search(val, node.left)
|
|
else:
|
|
return self.__search(val, node.right)
|
|
|
|
def remove_callable(self, val):
|
|
self.root = self.__remove(val, self.root)
|
|
|
|
def __remove(self, val, node):
|
|
|
|
if not node:
|
|
raise Exception('Value not found!')
|
|
elif node.val == val:
|
|
return self.set_less(node.left, node.right)
|
|
elif val < node.val:
|
|
node.left = self.__remove(val, node.left)
|
|
return node
|
|
else:
|
|
node.right = self.__remove(val, node.right)
|
|
return node
|
|
|
|
def show_callable(self):
|
|
tree = treelib.Tree()
|
|
tree = self.__show(tree, self.root)
|
|
tree.show()
|
|
|
|
def __show(self, tree, node):
|
|
|
|
if not node:
|
|
return tree
|
|
else:
|
|
if node.left:
|
|
tree = self.__show(tree, node.left)
|
|
tree.create_node(node.left.val, node.left.val, parent=node.val)
|
|
|
|
if node.right:
|
|
tree = self.__show(tree, node.right)
|
|
tree.create_node(node.right.val, node.right.val, parent=node.val)
|
|
|
|
return tree
|
|
|
|
if __name__ == '__main__':
|
|
|
|
tree = BinaryTree(Node(10))
|
|
tree.insert_callable(1)
|
|
tree.insert_callable(4)
|
|
tree.insert_callable(0)
|
|
tree.insert_callable(14)
|
|
tree.insert_callable(22)
|
|
|
|
tree.remove_callable(14)
|
|
|
|
print(tree.search_callable(1))
|
|
print(tree.search_callable(13))
|
|
print(tree.search_callable(4))
|
|
print(tree.search_callable(0))
|
|
print(tree.search_callable(14))
|
|
#print(tree.search_callable(22))
|
|
#print(tree.search_callable(12))
|
|
#print(tree.search_callable(15))
|
|
#print(tree.search_callable(16))
|
|
#print(tree.search_callable(-1))
|
|
#
|
|
|
|
#tree.show_callable()
|