Skip to content

Commit 0358ec5

Browse files
author
Deepak Malik
committed
Level Order Iterator
1 parent 2dc18fa commit 0358ec5

File tree

3 files changed

+198
-1
lines changed

3 files changed

+198
-1
lines changed
Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,90 @@
1+
/**
2+
* Algorithms-In-Java
3+
* LevelOrderIterator.java
4+
*/
15
package com.deepak.algorithms.Iterators;
26

3-
public class LevelOrderIterator {
7+
import java.util.Iterator;
8+
import java.util.LinkedList;
9+
import java.util.NoSuchElementException;
10+
import java.util.Queue;
11+
12+
import com.deepak.algorithms.Library.TreeNode;
13+
14+
/**
15+
* <br> Problem Statement :
16+
*
17+
* Implement an iterator that iterates through a binary tree in level order.
18+
*
19+
* </br>
20+
*
21+
* @author Deepak
22+
*/
23+
public class LevelOrderIterator<T> implements Iterator<T> {
24+
25+
/* Variable for next item to return */
26+
private T nextItem;
27+
/* Queue to hold items level by level */
28+
private final Queue<TreeNode<T>> queue;
29+
30+
/**
31+
* Constructor
32+
*
33+
* @param root
34+
*/
35+
public LevelOrderIterator(TreeNode<T> root) {
36+
queue = new LinkedList<>();
37+
queue.add(root);
38+
}
39+
40+
/**
41+
* Method to check if next element exists
42+
*/
43+
@Override
44+
public boolean hasNext() {
45+
/* If next item exists, return true */
46+
if (nextItem != null) {
47+
return true;
48+
}
49+
/* If queue is empty, return false */
50+
if (queue.isEmpty()) {
51+
return false;
52+
}
53+
/* Remove the node from the queue */
54+
TreeNode<T> node = queue.remove();
55+
/* If left or right child exists, add to the queue */
56+
if (node.hasLeft()) {
57+
queue.add(node.left);
58+
}
59+
if (node.hasRight()) {
60+
queue.add(node.right);
61+
}
62+
/* Update next item and return true */
63+
nextItem = node.item;
64+
return true;
65+
}
66+
67+
/**
68+
* Method to find next element
69+
*/
70+
@Override
71+
public T next() {
72+
/* If there is no next element, throw exception */
73+
if (!hasNext()) {
74+
throw new NoSuchElementException("No Element left in collection!!");
75+
}
76+
/* Update item to return and next value */
77+
T itemToReturn = nextItem;
78+
nextItem = null;
79+
return itemToReturn;
80+
}
81+
82+
/**
83+
* Method to remove the item
84+
*/
85+
@Override
86+
public void remove() {
87+
throw new UnsupportedOperationException("Remove not supported!");
88+
}
489

590
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Algorithms-In-Java
3+
* TreeNode.java
4+
*/
5+
package com.deepak.algorithms.Library;
6+
7+
/**
8+
* TreeNode class
9+
*
10+
* @author Deepak
11+
*
12+
* @param <T>
13+
*/
14+
public class TreeNode<T> {
15+
16+
/* Data in the node, left child and right child */
17+
public T item;
18+
public TreeNode<T> left;
19+
public TreeNode<T> right;
20+
21+
/**
22+
* Constructor
23+
*
24+
* @param item
25+
*/
26+
public TreeNode(T item) {
27+
this.item = item;
28+
}
29+
30+
public boolean hasLeft() {
31+
return left != null;
32+
}
33+
34+
public boolean hasRight() {
35+
return right != null;
36+
}
37+
38+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/**
2+
* Algorithms-in-Java
3+
* LevelOrderIterator_Test.java
4+
*/
5+
package com.deepak.algorithms.Iterators;
6+
7+
import java.util.NoSuchElementException;
8+
9+
import org.junit.Assert;
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
13+
import com.deepak.algorithms.Library.TreeNode;
14+
15+
/**
16+
* Test cases for level order iterator
17+
*
18+
* @author Deepak
19+
*/
20+
public class LevelOrderIterator_Test {
21+
22+
/* Root of the tree */
23+
private TreeNode<Integer> root;
24+
25+
/**
26+
* Setup to create a base tree
27+
*
28+
* 13
29+
* / \
30+
* 7 19
31+
* / \ / \
32+
* 3 9 17 23
33+
*/
34+
@Before
35+
public void setup() {
36+
root = new TreeNode<Integer>(13);
37+
TreeNode<Integer> node2 = new TreeNode<Integer>(7);
38+
TreeNode<Integer> node3 = new TreeNode<Integer>(19);
39+
TreeNode<Integer> node4 = new TreeNode<Integer>(3);
40+
TreeNode<Integer> node5 = new TreeNode<Integer>(9);
41+
TreeNode<Integer> node6 = new TreeNode<Integer>(17);
42+
TreeNode<Integer> node7 = new TreeNode<Integer>(23);
43+
44+
/* Setup Tree */
45+
root.left = node2;
46+
root.right = node3;
47+
node2.left = node4;
48+
node2.right = node5;
49+
node3.left = node6;
50+
node3.right = node7;
51+
}
52+
53+
/**
54+
* Test case to check level order iterator
55+
*/
56+
@Test(expected=NoSuchElementException.class)
57+
public void testLevelOrderIterator() {
58+
LevelOrderIterator<Integer> iterator = new LevelOrderIterator<>(root);
59+
Assert.assertTrue(iterator.hasNext());
60+
Assert.assertTrue(iterator.next() == 13);
61+
Assert.assertTrue(iterator.next() == 7);
62+
Assert.assertTrue(iterator.hasNext());
63+
Assert.assertTrue(iterator.next() == 19);
64+
Assert.assertTrue(iterator.next() == 3);
65+
Assert.assertTrue(iterator.hasNext());
66+
Assert.assertTrue(iterator.next() == 9);
67+
Assert.assertTrue(iterator.next() == 17);
68+
Assert.assertTrue(iterator.hasNext());
69+
Assert.assertTrue(iterator.next() == 23);
70+
Assert.assertFalse(iterator.hasNext());
71+
Assert.assertTrue(iterator.next() == 23);
72+
}
73+
74+
}

0 commit comments

Comments
 (0)