2017-11-13 19:09:54 -02:00
|
|
|
class TreeNode(object):
|
2019-10-21 16:08:12 -03:00
|
|
|
def __init__(self, data, left=None, right=None):
|
2018-02-20 05:19:49 +08:00
|
|
|
self.data = data
|
|
|
|
|
self.left = left
|
|
|
|
|
self.right = right
|
2017-11-13 19:09:54 -02:00
|
|
|
|
|
|
|
|
def __str__(self):
|
2018-02-20 05:19:49 +08:00
|
|
|
fmt = 'TreeNode(data={}, left={}, right={})'
|
|
|
|
|
return fmt.format(self.data, self.left, self.right)
|
2017-11-13 19:09:54 -02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class BinarySearchTree(object):
|
2018-02-20 05:19:49 +08:00
|
|
|
def __init__(self, tree_data):
|
2017-11-13 19:09:54 -02:00
|
|
|
self.root = None
|
2018-02-20 05:19:49 +08:00
|
|
|
for data in tree_data:
|
|
|
|
|
self.add(data)
|
|
|
|
|
|
|
|
|
|
def add(self, data):
|
|
|
|
|
if self.root is None:
|
2019-10-21 16:08:12 -03:00
|
|
|
self.root = TreeNode(data)
|
2018-02-20 05:19:49 +08:00
|
|
|
return
|
|
|
|
|
inserted = False
|
2017-11-13 19:09:54 -02:00
|
|
|
cur_node = self.root
|
|
|
|
|
|
2018-02-20 05:19:49 +08:00
|
|
|
while not inserted:
|
|
|
|
|
if data <= cur_node.data:
|
|
|
|
|
if cur_node.left:
|
|
|
|
|
cur_node = cur_node.left
|
|
|
|
|
else:
|
2019-10-21 16:08:12 -03:00
|
|
|
cur_node.left = TreeNode(data)
|
2018-02-20 05:19:49 +08:00
|
|
|
inserted = True
|
|
|
|
|
elif data > cur_node.data:
|
|
|
|
|
if cur_node.right:
|
|
|
|
|
cur_node = cur_node.right
|
|
|
|
|
else:
|
2019-10-21 16:08:12 -03:00
|
|
|
cur_node.right = TreeNode(data)
|
2018-02-20 05:19:49 +08:00
|
|
|
inserted = True
|
|
|
|
|
|
|
|
|
|
def _inorder_traverse(self, node, elements):
|
|
|
|
|
if node is not None:
|
|
|
|
|
self._inorder_traverse(node.left, elements)
|
|
|
|
|
elements.append(node.data)
|
|
|
|
|
self._inorder_traverse(node.right, elements)
|
|
|
|
|
|
|
|
|
|
def data(self):
|
|
|
|
|
return self.root
|
|
|
|
|
|
|
|
|
|
def sorted_data(self):
|
|
|
|
|
elements = []
|
|
|
|
|
self._inorder_traverse(self.root, elements)
|
|
|
|
|
return elements
|