#! /usr/bin/python3 # ================================================================== # create an binary search tree - show tree depth # # Notes: # 1. To simplify the code, all of the nodes have a common key # (an integer) for node comparison/insertion. (A sophisticated # comparison method could be developed.) # 2. Nodes are created outside of the binary tree code and inserted # into the tree. Thus, The binary tree code is not responsible # for the node's correctness. # 3. Perhaps one way to make the code less confusing to read # is for each node have a method to get it's key? # ================================================================== class Node: def __init__(self, data): self.data = data self.left = None self.right = None self.parent = None self.left_max_subtree_depth = 0 self.right_max_subtree_depth = 0 class BinaryTree: # ---- init object ------------------------------------ def __init__(self): self.root = None # ---- find maximum tree height ----------------------- def height(self): if self.root != None: return self._height(self.root,0) else: return 0 def _height(self,curnode,curheight): if curnode == None: return curheight left_height = self._height(curnode.left,curheight+1) right_height = self._height(curnode.right,curheight+1) return max(left_height,right_height) # ---- insert object into tree ------------------------ def insert(self,newnode): if self.root == None: self.root = newnode else: self._insert(newnode,self.root) if (self.root.left_max_subtree_depth < 0 or self.root.right_max_subtree_depth < 0): return False else: return True def _insert(self,newnode,curnode): if newnode.data < curnode.data: if curnode.left == None: newnode.parent = curnode ##newnode.left_max_subtree_depth = 0 curnode.left = newnode curnode.left_max_subtree_depth = 1 else: d = self._insert(newnode,curnode.left) if d < 0: return d curnode.left_max_subtree_depth = d + 1 elif newnode.data > curnode.data: if curnode.right == None: newnode.parent = curnode ##newnode.right_max_subtree_depth = 0 curnode.right = newnode curnode.right_max_subtree_depth = 1 else: d = self._insert(newnode,curnode.right) if d < 0: return d curnode.right_max_subtree_depth = d + 1 else: print("Tree node " + str(curnode.data) + " already in the tree") return -1 return max(curnode.left_max_subtree_depth, curnode.right_max_subtree_depth) # ---- print tree ------------------------------------- def PrintTree(self): if self.root == None: print("tree empty") else: self._PrintTree(self.root) def _PrintTreeNode(self,node): print("{}".format(str(node.data))) def _PrintTree(self,curnode): if curnode.left: self._PrintTree(curnode.left) print("{}".format(curnode.data)) if curnode.right: self._PrintTree(curnode.right) # ---- print tree structure --------------------------- def PrintTreeStructure(self): if self.root == None: print("tree empty") else: self._PrintTreeStructure(self.root,1) def _PrintTreeStructure(self,curnode,n): if curnode.right: self._PrintTreeStructure(curnode.right,n+1) if curnode.parent: print('{} {} (p={},ld={},rd={})'.format('---'*n, str(curnode.data), str(curnode.parent.data), str(curnode.left_max_subtree_depth), str(curnode.right_max_subtree_depth))) else: print('{} {} (p=None,ld={},rd={})'.format('---'*n, str(curnode.data), str(curnode.left_max_subtree_depth), str(curnode.right_max_subtree_depth))) if curnode.left: self._PrintTreeStructure(curnode.left,n+1) # ------------------------------------------------------------------ # main # ------------------------------------------------------------------ # ---- create a worst case tree def worst_case_tree(tree): values = [10,9,7,5,4,3,2,1,11,12,13,14,15,16,17] print(values) for v in values: tree.insert(Node(int(v))) return tree print("----create-tree--------------------------------------") tree = BinaryTree() worst_case_tree(tree) print("----print-tree-(in-order)----------------------------") tree.PrintTree() print("Maximum height of tree is {}".format(tree.height())) print("----print-tree-structure-(view-it-sideways)----------") tree.PrintTreeStructure() print("-----------------------------------------------------")