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

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -