diff --git a/traversals/binary_tree_traversals.py b/traversals/binary_tree_traversals.py index 3936645..5b9838b 100644 --- a/traversals/binary_tree_traversals.py +++ b/traversals/binary_tree_traversals.py @@ -1,190 +1,37 @@ -""" -This is pure python implementation of tree traversal algorithms -""" -from __future__ import print_function - -import queue - -try: - raw_input # Python 2 -except NameError: - raw_input = input # Python 3 - - -class TreeNode: - def __init__(self, data): - self.data = data - self.right = None - self.left = None - - -def build_tree(): - print("\n********Press N to stop entering at any point of time********\n") - print("Enter the value of the root node: ", end="") - check = raw_input().strip().lower() - if check == 'n': - return None - data = int(check) - q = queue.Queue() - tree_node = TreeNode(data) - q.put(tree_node) - while not q.empty(): - node_found = q.get() - print("Enter the left node of %s: " % node_found.data, end="") - check = raw_input().strip().lower() - if check == 'n': - return tree_node - left_data = int(check) - left_node = TreeNode(left_data) - node_found.left = left_node - q.put(left_node) - print("Enter the right node of %s: " % node_found.data, end="") - check = raw_input().strip().lower() - if check == 'n': - return tree_node - right_data = int(check) - right_node = TreeNode(right_data) - node_found.right = right_node - q.put(right_node) - - -def pre_order(node): - if not isinstance(node, TreeNode) or not node: - return - print(node.data, end=" ") - pre_order(node.left) - pre_order(node.right) - - -def in_order(node): - if not isinstance(node, TreeNode) or not node: - return - in_order(node.left) - print(node.data, end=" ") - in_order(node.right) - - -def post_order(node): - if not isinstance(node, TreeNode) or not node: - return - post_order(node.left) - post_order(node.right) - print(node.data, end=" ") - - -def level_order(node): - if not isinstance(node, TreeNode) or not node: - return - q = queue.Queue() - q.put(node) - while not q.empty(): - node_dequeued = q.get() - print(node_dequeued.data, end=" ") - if node_dequeued.left: - q.put(node_dequeued.left) - if node_dequeued.right: - q.put(node_dequeued.right) - - -def level_order_actual(node): - if not isinstance(node, TreeNode) or not node: - return - q = queue.Queue() - q.put(node) - while not q.empty(): - list = [] - while not q.empty(): - node_dequeued = q.get() - print(node_dequeued.data, end=" ") - if node_dequeued.left: - list.append(node_dequeued.left) - if node_dequeued.right: - list.append(node_dequeued.right) - print() - for node in list: - q.put(node) - - -# iteration version -def pre_order_iter(node): - if not isinstance(node, TreeNode) or not node: - return - stack = [] - n = node - while n or stack: - while n: # start from root node, find its left child - print(n.data, end=" ") - stack.append(n) - n = n.left - # end of while means current node doesn't have left child - n = stack.pop() - # start to traverse its right child - n = n.right - - -def in_order_iter(node): - if not isinstance(node, TreeNode) or not node: - return - stack = [] - n = node - while n or stack: - while n: - stack.append(n) - n = n.left - n = stack.pop() - print(n.data, end=" ") - n = n.right - - -def post_order_iter(node): - if not isinstance(node, TreeNode) or not node: - return - stack1, stack2 = [], [] - n = node - stack1.append(n) - while stack1: # to find the reversed order of post order, store it in stack2 - n = stack1.pop() - if n.left: - stack1.append(n.left) - if n.right: - stack1.append(n.right) - stack2.append(n) - while stack2: # pop up from stack2 will be the post order - print(stack2.pop().data, end=" ") - - -if __name__ == '__main__': - print("\n********* Binary Tree Traversals ************\n") - - node = build_tree() - print("\n********* Pre Order Traversal ************") - pre_order(node) - print("\n******************************************\n") - - print("\n********* In Order Traversal ************") - in_order(node) - print("\n******************************************\n") - - print("\n********* Post Order Traversal ************") - post_order(node) - print("\n******************************************\n") - - print("\n********* Level Order Traversal ************") - level_order(node) - print("\n******************************************\n") - - print("\n********* Actual Level Order Traversal ************") - level_order_actual(node) - print("\n******************************************\n") - - print("\n********* Pre Order Traversal - Iteration Version ************") - pre_order_iter(node) - print("\n******************************************\n") - - print("\n********* In Order Traversal - Iteration Version ************") - in_order_iter(node) - print("\n******************************************\n") - - print("\n********* Post Order Traversal - Iteration Version ************") - post_order_iter(node) - print("\n******************************************\n") +class Node: + def __init__(self,data): + self.left = None + self.right = None + self.data = data + +def inOrder(root): + if root: + inOrder(root.left) + print (root.data) + inOrder(root.right) + +def preOrder(root): + if root: + print (root.data) + preOrder(root.left) + preOrder(root.right) + +def postOrder(root): + if root: + postOrder(root.left) + postOrder(root.right) + print (root.data) + +#making the tree +root = Node(1) +root.left = Node(2) +root.right = Node(3) +root.left.left = Node(4) +root.left.right = Node(5) + +print inOrder(root) +#4 2 5 1 3 +print preOrder(root) +#1 2 4 5 3 +print postOrder(root) +#4 5 2 3 1