class BSTNode: def __init__(self, value): self.value = value self.left = None self.right = None def height(self): lh = 0 rh = 0 if self.left is not None: lh = self.left.height() if self.right is not None: rh = self.right.height() return 1 + max(lh, rh) class BST: def __init__(self): self.root = None self.size = 0 def clear(self): self.root = None self.size = 0 def add(self, value): to_add = BSTNode(value) if self.root is None: self.root = to_add self.size += 1 else: current = self.root parent = None while current is not None: if value > current.value: parent = current current = current.right elif value < current.value: parent = current current = current.left else: return if value > parent.value: parent.right = to_add else: parent.left = to_add self.size += 1 def inOrder(self): ret = [] inOrderRec(self.root, ret) return ret @classmethod def balance(cls, list_param): tree = cls() add_rec(0, len(list_param) - 1, list_param, tree) return tree def height(self): return self.root.height() def inOrderRec(top, ret): if top is None: return if top.left: inOrderRec(top.left, ret) ret.append(top) if top.right: inOrderRec(top.right, ret) def add_rec(start, end, list_param, tree: BST): if end - start >= 0: mid = (start + end) // 2 tree.add(list_param[mid]) add_rec(start, mid - 1, list_param, tree) add_rec(mid + 1, end, list_param, tree) if __name__ == "__main__": test = 17 list_param = list(range(test)) tree = BST.balance(list_param) tree2 = BST() for i in range(test): tree2.add(i) r = list(node.value for node in tree.inOrder()) r2 = list(node.value for node in tree2.inOrder()) assert r == r2