Breadth-first traversals: It is also called Level Order traversal. Here we visit all the nodes that are at the same level before visiting the nodes at the next level.
Depth-first traversals:
There are three types of depth first traversals:
Pre-Order Traversal: We first visit the root, then the the left subtree and right subtree.
In-Order Traversal: We first visit the left subtree, then the root and right subtree.
Post-Order Traversal: We first visit the left subtree, then the right subtree and root.
Basic schema of depth first traversals:
Pre-Order Traversal
: Parent Left Right
In-Order Traversal
: Left Parent Right
Post-order Traversal
: Left Right Parent
In pre-order traversal we visit the node then go to the left subtree
then right subtree
.
/*
* Time: O(n)
* Space: O(1)
*/
// Method overloading
public void preOrderTraversal() {
preOrderTraversal(root);
}
private void preOrderTraversal(Node root) {
if (root == null)
return;
System.out.println(root.value);
preOrderTraversal(root.leftChild);
preOrderTraversal(root.rightChild);
}
In In-Order traversal, we first visit the left node, then parent, then right node.
/*
* Time: O(n)
* Space: O(1)
*/
public void inOrderTraversal() {
inOrderTraversal(root);
}
private void inOrderTraversal(Node root) {
if (root == null)
return;
inOrderTraversal(root.leftChild);
System.out.println(root.value);
inOrderTraversal(root.rightChild);
}
In this method we visit the left node, then right node then the parent.
/*
* Time: O(n)
* Space: O(1)
*/
// Method overloading
public void postOrderTraversal() {
postOrderTraversal(root);
}
private void postOrderTraversal(Node root) {
if (root == null)
return;
postOrderTraversal(root.leftChild);
postOrderTraversal(root.rightChild);
System.out.println(root.value);
}
In this traversal we visit the nodes in first level and then go on to the next level till there are no levels to visit. Its called level order traversal.
/*
* Time: O(n)
* Space: O(n)
*/
public void levelOrder() {
if (root == null)
return;
// this is how we create a queue in java
Queue<Node> visited = new LinkedList<Node>();
// .add just adds the new node to the end of the queue
visited.add(root);
while (!visited.isEmpty()) {
// poll is basically pop from the first. It removes first element in the queue
Node current = visited.poll();
System.out.println(current.value);
if (current.leftChild != null)
visited.add(current.leftChild);
if (current.rightChild != null)
visited.add(current.rightChild);
}
// We need to add a node before we call the method so we don't keep calling the
// parent node in the method
}
An example of this would look something like this:
2
1 3
0 1 3 3
visited = [];
// add 2 into the queue
// visited = [2]
while visited.length != 0 :
current = visited.poll() // current = (Node) 2, visited = [];
print(current) // print(2)
if(current.leftChild != null) visited.push(current.leftChild) // visited = [1]
if(current.rightChild != null) visited.push(current.rightChild) // visited = [1,3]
// Keep doing this till the queue is empty, for practice you can trace this by yourself
Lets also look at some extra methods, findMin
and contains
, they are direct if you
understand how the traversals work :).
int findMin() {
// Ill slowly add exceptions, since java is a strict type language I recommend
// y'all to learn it as well
if (root == null)
throw new RuntimeErrorException(null, "No root in the tree");
Node current = root;
// We only want to iterate to the left cuz the left most is where the smallest
// node is at
// similar to how it works in linked list
while (current.leftChild != null)
current = current.leftChild;
return current.value;
}
Now lest look at contains
Boolean contains(int value) {
return contains(root, value);
}
private Boolean contains(Node node, int value) {
if (node == null)
return false;
if (node.value == value)
return true;
if (value < node.value)
return contains(node.leftChild, value);
else // value > node.value
return contains(node.rightChild, value);
}
This Project is Open sourced!!, visit our github to contribute