import sys class Node: def __init__(self, value=0): self.left = None self.right = None self.value = value self.height = 1 class Tree: def __init__(self): self.root = None def add(self, start, value): if not start: return Node(value) else: if value < start.value: start.left = self.add(start.left, value) else: start.right = self.add(start.right, value) start.height = max(self.getHeight(start.left), self.getHeight(start.right)) +1 #pokud je v jedne urovni rozdil vysek, divam se kam rotovat if self.getChildDiff(start) > 1: if value < start.left.value: return self.rotateRight(start) else: #potreba prerotovat 2x start.left = self.rotateLeft(start.left) return self.rotateRight(start) if self.getChildDiff(start) < -1: if value > start.right.value: return self.rotateLeft(start) else: start.right = self.rotateRight(start.right) return self.rotateLeft(start) return start def getHeight(self, node): if node is None: return 0 return node.height def getChildDiff(self, node): if node is None: return 0 return self.getHeight(node.left) - self.getHeight(node.right) def rotateRight(self, node): child = node.left pravy = child.right child.right = node node.left = pravy vyssi = max(self.getHeight(node.left), self.getHeight(node.right)) vyssi2 = max(self.getHeight(child.left), self.getHeight(child.right)) node.height = vyssi + 1 child.height = vyssi2 +1 return child def rotateLeft(self, node): child = node.right levy = child.left child.left = node node.right = levy vyssi = max(self.getHeight(node.left), self.getHeight(node.right)) vyssi2 = max(self.getHeight(child.left), self.getHeight(child.right)) node.height = vyssi + 1 child.height = vyssi2 + 1 return child def printer(node): heightVal = height(node) for i in range(1,heightVal+1): printHeight(node, i) if i != heightVal: print('|', end=" ") print() def printHeight(node, height): if node is None: print('_ ', end=" ") return if height == 1: print(node.value, end=" ") else: if height > 1: printHeight(node.left, height-1) printHeight(node.right, height-1) def height(node): if node is None: return 0 else: left = height(node.left) right = height(node.right) if left > right: #+1 kvuli korenu return left+1 else: return right+1 def avltree(): tree = Tree() root = None for line in sys.stdin: if line == '\n': break value = line.replace("\n", "") value = int(value) root = tree.add(root, value) printer(root) avltree()