def traverseDFSpreorder(self):
     #root, left subtree, right subtree
     keys = []
     dfsS = Stack()
     dfsS.push(self.root)
     cur = dfsS.pop()
     while cur:
         #print("cur.key = %s"%cur.key)
         keys.append(cur.key)
         #print("%s added to keys" % str(cur.key))
         if (cur.right):
             dfsS.push(cur.right)
             #print("cur.right.key = %s"%cur.right.key)
         if (cur.left):
             dfsS.push(cur.left)
             #print('cur.left.key = %s' % cur.left.key)
         cur = dfsS.pop()
         #print("--------------------------------")
     return keys
 def traverseDFSinorder(self):
     #left subtree, root, right subtree
     keys = []
     dfsS = Stack()
     dfsS.push(self.root)
     cur = dfsS.pop()
     while cur:
         #print("cur.key = %s"%cur.key)
         if ((not cur.left) or (cur.left.key in keys)):
             keys.append(cur.key)
             #print("%s added to keys" % str(cur.key))
             if (cur.right):
                 dfsS.push(cur.right)
                 #print("cur.right.key = %s"%cur.right.key)
         else:
             dfsS.push(cur)
             if (cur.left and cur.left.key not in keys):
                 dfsS.push(cur.left)
                 #print('cur.left.key = %s' % cur.left.key)
         cur = dfsS.pop()
         #print("--------------------------------")
     return keys
 def __init__(self):
     self.root = None
     self.current = None
     self.queue = Queue()
     self.past = Stack()