class SStack():
def __init__(self):
self._elem = []
def is_empty(self):
return self._elem == []
def top(self):
if self.is_empty():
return False
else:
return self._elem[-1]
def push(self, e):
self._elem.append(e)
def pop(self):
if self.is_empty():
return False
else:
return self._elem.pop()
class Node:
def __init__(self, elem=0, left=None, right=None):
self.elem = elem
self.left = left
self.right = right
def proc_data(data):
print(data.elem)
def preorder_tree(tree_node):
if tree_node == None:
return None
ss = SStack()
tmp = tree_node
while tmp is not None or not ss.is_empty():
while tmp is not None:
proc_data(tmp)
ss.push(tmp.right)
tmp = tmp.left
tmp = ss.pop()
def inorder_tree(tree_node):
if tree_node == None:
return False
ss = SStack()
tmp = tree_node
while tmp is not None or not ss.is_empty(): #terminating conditions
while tmp is not None:
ss.push(tmp)
tmp = tmp.left
tmp = ss.pop()
proc_data(tmp)
tmp = tmp.right
def postorder_tree(tree_node):
if tree_node == None:
return False
ss = SStack()
tmp = tree_node
while tmp is not None or not ss.is_empty():
while tmp is not None:
ss.push(tmp)
tmp = tmp.left if tmp.left is not None else tmp.right
tmp = ss.pop()
proc_data(tmp)
if not ss.is_empty() and ss.top().left == tmp:
tmp = ss.top().right
else:
tmp = None
node1 = Node(1)
node2 = Node(2)
node3 = Node(3, node1, node2)
node4 = Node(4)
node5 = Node(5)
node6 = Node(6, node4, node5)
node7 = Node(7, node3, node6)
if __name__ == "__main__":
#postorder_tree(node7)
#preorder_tree(node7)
inorder_tree(node7)