Level Order Tree Traversal
Level order traversal of a tree is breadth first traversal for the tree.
METHOD 1 (Use function to print a given level)
Implementation:
// Recursive Java program for level order traversal of Binary Tree /* Class containing left and right child of current node and key value*/ class Node { int data; Node left, right; public Node( int item) { data = item; left = right = null ; } } class BinaryTree { // Root of the Binary Tree Node root; public BinaryTree() { root = null ; } /* function to print level order traversal of tree*/ void printLevelOrder() { int h = height(root); int i; for (i= 1 ; i<=h; i++) printGivenLevel(root, i); } /* Compute the "height" of a tree -- the number of nodes along the longest path from the root node down to the farthest leaf node.*/ int height(Node root) { if (root == null ) return 0 ; else { /* compute height of each subtree */ int lheight = height(root.left); int rheight = height(root.right); /* use the larger one */ if (lheight > rheight) return (lheight+ 1 ); else return (rheight+ 1 ); } } /* Print nodes at the given level */ void printGivenLevel (Node root , int level) { if (root == null ) return ; if (level == 1 ) System.out.print(root.data + " " ); else if (level > 1 ) { printGivenLevel(root.left, level- 1 ); printGivenLevel(root.right, level- 1 ); } } /* Driver program to test above functions */ public static void main(String args[]) { BinaryTree tree = new BinaryTree(); tree.root= new Node( 1 ); tree.root.left= new Node( 2 ); tree.root.right= new Node( 3 ); tree.root.left.left= new Node( 4 ); tree.root.left.right= new Node( 5 ); System.out.println( "Level order traversal of binary tree is " ); tree.printLevelOrder(); } } |
Output:
Level order traversal of binary tree is - 1 2 3 4 5
Time Complexity: O(n^2) in worst case. For a skewed tree, printGivenLevel() takes O(n) time where n is the number of nodes in the skewed tree. So time complexity of printLevelOrder() is O(n) + O(n-1) + O(n-2) + .. + O(1) which is O(n^2).
METHOD 2 (Use Queue)
Algorithm:
For each node, first the node is visited and then it’s child nodes are put in a FIFO queue.
For each node, first the node is visited and then it’s child nodes are put in a FIFO queue.
Implementation:
Here is a simple implementation of the above algorithm. Queue is implemented using an array with maximum size of 500. We can implement queue as linked list also.
// Iterative Queue based Java program to do level order traversal // of Binary Tree /* importing the inbuilt java classes required for the program */ import java.util.Queue; import java.util.LinkedList; /* Class to represent Tree node */ class Node { int data; Node left, right; public Node( int item) { data = item; left = null ; right = null ; } } /* Class to print Level Order Traversal */ class BinaryTree { Node root; /* Given a binary tree. Print its nodes in level order using array for implementing queue */ void printLevelOrder() { Queue<Node> queue = new LinkedList<Node>(); queue.add(root); while (!queue.isEmpty()) { /* poll() removes the present head. For more information on poll() visit Node tempNode = queue.poll(); System.out.print(tempNode.data + " " ); /*Enqueue left child */ if (tempNode.left != null ) { queue.add(tempNode.left); } /*Enqueue right child */ if (tempNode.right != null ) { queue.add(tempNode.right); } } } public static void main(String args[]) { /* creating a binary tree and entering the nodes */ BinaryTree tree_level = new BinaryTree(); tree_level.root = new Node( 1 ); tree_level.root.left = new Node( 2 ); tree_level.root.right = new Node( 3 ); tree_level.root.left.left = new Node( 4 ); tree_level.root.left.right = new Node( 5 ); System.out.println( "Level order traversal of binary tree is - " ); tree_level.printLevelOrder(); } } |
No comments:
Post a Comment