# Example binary search tree. (1.01) class TreeNode: def __init__(self, data=None): self.data = data self.left = None self.right = None class Tree: def __init__(self): self.root = None def insert(self, data): """Insert data into tree maintaining BST order.""" def _insert(root): if not root: root = TreeNode(data) elif data < root.data: root.left = _insert(root.left) elif data > root.data: root.right = _insert(root.right) else: root.data = data return root self.root = _insert(self.root) def balance(self): """Reorder tree so all paths have near uniform depth""" a = list(self.inorder()) self.root = None def insert_mid(lo, hi): if lo == hi: return mid = lo + (hi - lo) // 2 self.insert(a[mid]) insert_mid(lo, mid) insert_mid(mid + 1, hi) insert_mid(0, len(a)) def inorder(self): """Generate data inorder""" def _inorder(root): if root: yield from _inorder(root.left) yield root.data yield from _inorder(root.right) yield from _inorder(self.root) def levelorder(self): """Generate data in level order.""" # @note Each valid node matches two children on the following level. # # Input: [10, 30, 20, 40] # # [10] = 10 # ['', 30] = / \ # [20, 40] = '' 30 # = / \ # = 20 40 q = [self.root] while q.count(None) != len(q): nodes = q q = [] r = [] for node in nodes: if not node: r.append('') # None else: r.append(node.data) q.extend((node.left, node.right)) yield r # Main. from random import sample def pretty_print_tree(t): levels = iter(t.levelorder()) print('>', next(levels, None)) for level in levels: print(' ', level) def show(a): t = Tree() for x in a: t.insert(x) print(a) print(list(t.inorder())) pretty_print_tree(t) t.balance() pretty_print_tree(t) # Original problem. a = [50, 40, 45, 47, 46, 41, 35] show(a) # Degenerate tree (list). n = 2**3-1 a = list(reversed(range(n))) show(a) # Random. n = 2**3-1 a = sample(range(n), k=n) show(a)
Standard input is empty
[50, 40, 45, 47, 46, 41, 35] [35, 40, 41, 45, 46, 47, 50] > [50] [40, ''] [35, 45] ['', '', 41, 47] ['', '', 46, ''] > [45] [40, 47] [35, 41, 46, 50] [6, 5, 4, 3, 2, 1, 0] [0, 1, 2, 3, 4, 5, 6] > [6] [5, ''] [4, ''] [3, ''] [2, ''] [1, ''] [0, ''] > [3] [1, 5] [0, 2, 4, 6] [2, 1, 3, 6, 0, 5, 4] [0, 1, 2, 3, 4, 5, 6] > [2] [1, 3] [0, '', '', 6] ['', '', 5, ''] [4, ''] > [3] [1, 5] [0, 2, 4, 6]