package DataStructures.Trees; import java.util.LinkedList; /** * @author Varun Upadhyay (https://github.com/varunu28) */ // Driver Program public class TreeTraversal { public static void main(String[] args) { Node tree = new Node(5); tree.insert(3); tree.insert(2); tree.insert(7); tree.insert(4); tree.insert(6); tree.insert(8); // Prints 5 3 2 4 7 6 8 System.out.println("Pre order traversal:"); tree.printPreOrder(); System.out.println(); // Prints 2 3 4 5 6 7 8 System.out.println("In order traversal:"); tree.printInOrder(); System.out.println(); // Prints 2 4 3 6 8 7 5 System.out.println("Post order traversal:"); tree.printPostOrder(); System.out.println(); // Prints 5 3 7 2 4 6 8 System.out.println("Level order traversal:"); tree.printLevelOrder(); System.out.println(); } } /** * The Node class which initializes a Node of a tree * Consists of all 4 traversal methods: printInOrder, printPostOrder, printPreOrder & printLevelOrder * printInOrder: LEFT -> ROOT -> RIGHT * printPreOrder: ROOT -> LEFT -> RIGHT * printPostOrder: LEFT -> RIGHT -> ROOT * printLevelOrder: Prints by level (starting at root), from left to right. */ class Node { Node left, right; int data; public Node(int data) { this.data = data; } public void insert(int value) { if (value < data) { if (left == null) { left = new Node(value); } else { left.insert(value); } } else { if (right == null) { right = new Node(value); } else { right.insert(value); } } } public void printInOrder() { if (left != null) { left.printInOrder(); } System.out.print(data + " "); if (right != null) { right.printInOrder(); } } public void printPreOrder() { System.out.print(data + " "); if (left != null) { left.printPreOrder(); } if (right != null) { right.printPreOrder(); } } public void printPostOrder() { if (left != null) { left.printPostOrder(); } if (right != null) { right.printPostOrder(); } System.out.print(data + " "); } /** * O(n) time algorithm. * Uses O(n) space to store nodes in a queue to aid in traversal. */ public void printLevelOrder() { LinkedList queue = new LinkedList<>(); queue.add(this); while (queue.size() > 0) { Node head = queue.remove(); System.out.print(head.data + " "); // Add children of recently-printed node to queue, if they exist. if (head.left != null) { queue.add(head.left); } if (head.right != null) { queue.add(head.right); } } } }