Skip to content

Commit a584ca2

Browse files
authored
Refactor Level Order Traversal (TheAlgorithms#3869)
1 parent c0fec8d commit a584ca2

File tree

7 files changed

+154
-98
lines changed

7 files changed

+154
-98
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,38 @@
11
package com.thealgorithms.datastructures.trees;
22

3-
public class LevelOrderTraversal {
4-
5-
class Node {
6-
7-
int data;
8-
Node left, right;
9-
10-
public Node(int item) {
11-
data = item;
12-
left = right = null;
13-
}
14-
}
3+
import java.util.ArrayList;
4+
import java.util.LinkedList;
5+
import java.util.List;
6+
import java.util.Queue;
157

16-
// Root of the Binary Tree
17-
Node root;
18-
19-
public LevelOrderTraversal(Node root) {
20-
this.root = root;
21-
}
22-
23-
/* function to print level order traversal of tree*/
24-
void printLevelOrder() {
25-
int h = height(root);
26-
int i;
27-
for (i = 1; i <= h; i++) {
28-
printGivenLevel(root, i);
29-
}
30-
}
8+
public class LevelOrderTraversal {
319

32-
/* Compute the "height" of a tree -- the number of
33-
nodes along the longest path from the root node
34-
down to the farthest leaf node.*/
35-
int height(Node root) {
10+
static List<List<Integer>> traverse(BinaryTree.Node root) {
3611
if (root == null) {
37-
return 0;
38-
} else {
39-
/**
40-
* Return the height of larger subtree
41-
*/
42-
return Math.max(height(root.left), height(root.right)) + 1;
12+
return List.of();
4313
}
44-
}
4514

46-
/* Print nodes at the given level */
47-
void printGivenLevel(Node root, int level) {
48-
if (root == null) {
49-
return;
50-
}
51-
if (level == 1) {
52-
System.out.print(root.data + " ");
53-
} else if (level > 1) {
54-
printGivenLevel(root.left, level - 1);
55-
printGivenLevel(root.right, level - 1);
15+
List<List<Integer>> result = new ArrayList<>();
16+
17+
Queue<BinaryTree.Node> q = new LinkedList<>();
18+
q.add(root);
19+
while (!q.isEmpty()) {
20+
int nodesOnLevel = q.size();
21+
List<Integer> level = new LinkedList<>();
22+
for (int i = 0; i < nodesOnLevel; i++) {
23+
BinaryTree.Node tempNode = q.poll();
24+
level.add(tempNode.data);
25+
26+
if (tempNode.left != null) {
27+
q.add(tempNode.left);
28+
}
29+
30+
if (tempNode.right != null) {
31+
q.add(tempNode.right);
32+
}
33+
}
34+
result.add(level);
5635
}
36+
return result;
5737
}
5838
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.thealgorithms.datastructures.trees;
2+
3+
public class LevelOrderTraversalHelper {
4+
/* function to print level order traversal of tree*/
5+
public static void printLevelOrder(BinaryTree.Node root) {
6+
if (root == null) {
7+
System.out.println("Root node must not be null! Exiting.");
8+
return;
9+
}
10+
11+
int h = height(root);
12+
int i;
13+
for (i = 1; i <= h; i++) {
14+
printGivenLevel(root, i);
15+
}
16+
}
17+
18+
/* Compute the "height" of a tree -- the number of
19+
nodes along the longest path from the root node
20+
down to the farthest leaf node.*/
21+
private static int height(BinaryTree.Node root) {
22+
if (root == null) {
23+
return 0;
24+
} else {
25+
//return the height of larger subtree
26+
return Math.max(height(root.left), height(root.right)) + 1;
27+
}
28+
}
29+
30+
/* Print nodes at the given level */
31+
public static void printGivenLevel(BinaryTree.Node root, int level) {
32+
if (root == null) {
33+
System.out.println("Root node must not be null! Exiting.");
34+
return;
35+
}
36+
if (level == 1) {
37+
System.out.print(root.data + " ");
38+
} else if (level > 1) {
39+
printGivenLevel(root.left, level - 1);
40+
printGivenLevel(root.right, level - 1);
41+
}
42+
}
43+
}

src/main/java/com/thealgorithms/datastructures/trees/LevelOrderTraversalQueue.java

-45
This file was deleted.

src/main/java/com/thealgorithms/datastructures/trees/ZigzagTraversal.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
public class ZigzagTraversal {
3333
public static List<List<Integer>> traverse(BinaryTree.Node root) {
3434
if (root == null) {
35-
return new ArrayList<>();
35+
return List.of();
3636
}
3737

3838
List<List<Integer>> result = new ArrayList<>();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.thealgorithms.datastructures.trees;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.Collections;
6+
import java.util.List;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
10+
/**
11+
* @author Albina Gimaletdinova on 08/02/2023
12+
*/
13+
public class LevelOrderTraversalTest {
14+
@Test
15+
public void testRootNull() {
16+
assertEquals(Collections.emptyList(), LevelOrderTraversal.traverse(null));
17+
}
18+
19+
@Test
20+
public void testSingleNodeTree() {
21+
final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{50});
22+
assertEquals(List.of(List.of(50)), LevelOrderTraversal.traverse(root));
23+
}
24+
25+
/*
26+
1
27+
/ \
28+
2 3
29+
/\ /\
30+
4 5 6 7
31+
*/
32+
@Test
33+
public void testLevelOrderTraversalCompleteTree() {
34+
final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{1, 2, 3, 4, 5, 6, 7});
35+
assertEquals(List.of(List.of(1), List.of(2, 3), List.of(4, 5, 6, 7)), LevelOrderTraversal.traverse(root));
36+
}
37+
38+
/*
39+
1
40+
/ \
41+
2 3
42+
/\ /\
43+
4 5 6 7
44+
/ \
45+
8 9
46+
*/
47+
@Test
48+
public void testLevelOrderTraversalDifferentHeight() {
49+
final BinaryTree.Node root = TreeTestUtils.createTree(
50+
new Integer[]{1, 2, 3, 4, 5, 6, 7, null, null, 8, null, null, 9});
51+
assertEquals(List.of(List.of(1), List.of(2, 3), List.of(4, 5, 6, 7), List.of(8, 9)),
52+
LevelOrderTraversal.traverse(root));
53+
}
54+
}

src/test/java/com/thealgorithms/datastructures/trees/VerticalOrderTraversalTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void testVerticalTraversalCompleteTree() {
4040
/ \
4141
2 3
4242
/\ /\
43-
4 56 7
43+
4 5 6 7
4444
/ \
4545
8 9
4646
*/

src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java

+27-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,33 @@ public void testSingleNodeTree() {
2222
assertEquals(List.of(List.of(50)), ZigzagTraversal.traverse(root));
2323
}
2424

25+
/*
26+
1
27+
/ \
28+
2 3
29+
/\ /\
30+
4 5 6 7
31+
*/
2532
@Test
26-
public void testZigzagTraversal() {
27-
final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{7, 6, 14, 2, 80, 100});
28-
assertEquals(List.of(List.of(7), List.of(14, 6), List.of(2, 80, 100)), ZigzagTraversal.traverse(root));
33+
public void testZigzagTraversalCompleteTree() {
34+
final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{1, 2, 3, 4, 5, 6, 7});
35+
assertEquals(List.of(List.of(1), List.of(3, 2), List.of(4, 5, 6, 7)), ZigzagTraversal.traverse(root));
36+
}
37+
38+
/*
39+
1
40+
/ \
41+
2 3
42+
/\ /\
43+
4 5 6 7
44+
/ \
45+
8 9
46+
*/
47+
@Test
48+
public void testZigzagTraversalDifferentHeight() {
49+
final BinaryTree.Node root = TreeTestUtils.createTree(
50+
new Integer[]{1, 2, 3, 4, 5, 6, 7, null, null, 8, null, null, 9});
51+
assertEquals(List.of(List.of(1), List.of(3, 2), List.of(4, 5, 6, 7), List.of(9, 8)),
52+
ZigzagTraversal.traverse(root));
2953
}
3054
}

0 commit comments

Comments
 (0)