Python: binary tree traversal iterators without using conditionals -
i trying create module in python iterating on binary tree using 4 standard tree traversals (inorder, preorder, postorder , levelorder) without using conditionals , using polymorphic method dispatch or iterators. following examples should work.
for e in t.preorder(): print(e) e in t.postorder(): print(e) e in t.inorder(): print(e) e in t.levelorder(): print(e)
so far have come following
def build_tree(preord, inord): tree = binarytree() tree.root = buildtreehelper(preord, inord) return tree def buildtreehelper(preorder, inorder): if len(inorder) == 0: return none elem = preorder[0] eleminorderindex = inorder.find(elem) if eleminorderindex > -1: leftpreorder = preorder[1:eleminorderindex + 1] rightpreorder = preorder[eleminorderindex + 1:] leftinorder = inorder[0:eleminorderindex] rightinorder = inorder[eleminorderindex + 1:] left = buildtreehelper(leftpreorder, leftinorder) right = buildtreehelper(rightpreorder, rightinorder) return binarytreenode(elem, left, right) else: return "no valid tree given args" class binarytree: def __init__(self): self.root = none def preorder(self): return self.root.preorder() def inorder(self): return self.root.inorder() def postoder(self): return self.root.postorder() class binarytreenode: def __init__(self, element, left=none, right=none): self.element = element self.left = left self.right = right def preorder(self): yield self.element e in self.left.preorder(): yield e e in self.right.preorder(): yield e def inorder(self): e in self.left.inorder(): yield e yield self.element e in self.right.inorder(): yield e def postorder(self): e in self.left.postorder(): yield e e in self.right.postorder(): yield e yield self.element if __name__ == "__main__": t = build_tree("bac", "abc") e in t.inorder(): print(e)
when try run 1 of iterators @ bottom of code attributeerror: 'nonetype' object has no attribute 'inorder' error message. think because never raise stopiteration. ideas on how fix , start implementing levelorder?
you said wanted use polymorphism, don't seem have done so. replace occurrences of 'none' in code special object supports methods returns empty sequence , work.
also should take more care of indentation when posting python questions. code posted won't run is.
def build_tree(preord, inord): tree = binarytree() tree.root = buildtreehelper(preord, inord) return tree def buildtreehelper(preorder, inorder): if len(inorder) == 0: return empty elem = preorder[0] eleminorderindex = inorder.find(elem) if eleminorderindex > -1: leftpreorder = preorder[1:eleminorderindex + 1] rightpreorder = preorder[eleminorderindex + 1:] leftinorder = inorder[0:eleminorderindex] rightinorder = inorder[eleminorderindex + 1:] left = buildtreehelper(leftpreorder, leftinorder) right = buildtreehelper(rightpreorder, rightinorder) return binarytreenode(elem, left, right) else: return "no valid tree given args" class binarytree: def __init__(self): self.root = empty def preorder(self): return self.root.preorder() def inorder(self): return self.root.inorder() def postorder(self): return self.root.postorder() class emptynode: def preorder(self): return () inorder = postorder = preorder empty = emptynode() class binarytreenode: def __init__(self, element, left=empty, right=empty): self.element = element self.left = left self.right = right def preorder(self): yield self.element e in self.left.preorder(): yield e e in self.right.preorder(): yield e def inorder(self): e in self.left.inorder(): yield e yield self.element e in self.right.inorder(): yield e def postorder(self): e in self.left.postorder(): yield e e in self.right.postorder(): yield e yield self.element if __name__ == "__main__": t = build_tree("bac", "abc") e in t.inorder(): print(e)
Comments
Post a Comment