3 min to read
Algorithms - Binary tree traversals in kotlin
A simple walkthrough of binary tree traversals algorithms with kotlin examples
Traversals :
“Tree traversal refers to the process of visiting (checking and/or updating) each node in a tree data structure, exactly once. Such traversals are classified by the order in which the nodes are visited.” -— Wikipedia
There are 2 options:
- DFS : Depth-First Search _“is an algorithm for traversing or searching tree data structure. One starts at the root and explores as far as possible along each branch before backtracking.” -— Wikipedia
- BFS : Breadth-First Search “is an algorithm for traversing or searching tree data structure. It starts at the tree root and explores the neighbor nodes first, before moving to the next level neighbors.” -— Wikipedia
DFS - Depth-First Search
DFS algorithms start from the root and goes deep as possible until they find a leaf before backtracking and exploring another path. The main 3 DFS types are:
- Pre-Order: (NLR) process node data, left child and finally right child
- In-Order: (LNR) process left child, node data and finally right child
- Post-Order: (LRN) process left child, right child and finally node data
Kotlin Examples:
Usually the DFS algorithms are ease to implement with recursion.
Binary tree
data class BinaryTreeNode(
val data:Int,
val left:BinaryTreeNode? = null,
val right:BinaryTreeNode? = null
)
Preorder traversal
fun preOrderTraversal(node: BinaryTreeNode?,
operation: (BinaryTreeNode) -> Unit){
if (node == null) return;
// Visit node
operation.invoke(node)
// Traverse left
preOrderTraversal(node.left,operation);
// Traverse right
preOrderTraversal(node.right,operation);
}
InOrder traversal
fun inOrderTraversal(node: BinaryTreeNode?,
operation: (BinaryTreeNode) -> Unit){
if (node == null) return;
// Traverse left
inOrderTraversal(node.left,operation);
// Visit node
operation.invoke(node)
// Traverse right
inOrderTraversal(node.right,operation);
}
PostOrder traversal
fun postOrderTraversal(node: BinaryTreeNode?,
operation: (BinaryTreeNode) -> Unit){
if (node == null) return;
// Traverse left
postOrderTraversal(node.left,operation)
// Traverse right
postOrderTraversal(node.right,operation)
// Visit node
operation.invoke(node)
}
BFS - Breadth-First Search
For BFS algorithm we are going to use a queue:
- Push root node to the queue
-
While queue is not empty:
- Poll element from queue and process data
- If left child exist, add to the queue
- If right child exist, add to the queue
fun bfs(node: BinaryTreeNode, operation: (BinaryTreeNode) -> Unit){
val queue = LinkedList<BinaryTreeNode>() as Queue<BinaryTreeNode>
queue.offer(node)
var current : BinaryTreeNode
while(!queue.isEmpty()){
current = queue.poll()
operation.invoke(current)
if (current.left != null){
queue.offer(current.left)
}
if (current.right != null){
queue.offer(current.right)
}
}
}
You can find the complete code of this example in this GitHub repository