Skip to content

Commit 022abaa

Browse files
committed
Add tree traversal
1 parent c10c749 commit 022abaa

14 files changed

+207
-72
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,14 @@
5858
## Algorithms
5959

6060
1. Bubble Sort – [solution](src/main/kotlin/ru/romanow/algorithms/BubbleSort.kt), [test](src/test/kotlin/ru/romanow/algorithms/BubbleSortTest.kt)
61-
2. Selection Sort – [solution](src/main/kotlin/ru/romanow/algorithms/InsertionSort.kt), [test](src/test/kotlin/ru/romanow/algorithms/InsertionSortTest.kt)
61+
2. Insertion Sort – [solution](src/main/kotlin/ru/romanow/algorithms/InsertionSort.kt), [test](src/test/kotlin/ru/romanow/algorithms/InsertionSortTest.kt)
6262
3. Selection Sort – [solution](src/main/kotlin/ru/romanow/algorithms/SelectionSort.kt), [test](src/test/kotlin/ru/romanow/algorithms/SelectionSortTest.kt)
6363
4. Quick Sort – [solution](src/main/kotlin/ru/romanow/algorithms/QuickSort.kt), [test](src/test/kotlin/ru/romanow/algorithms/QuickSortTest.kt)
6464
5. Merge Sort – [solution](src/main/kotlin/ru/romanow/algorithms/MergeSort.kt), [test](src/test/kotlin/ru/romanow/algorithms/MergeSortTest.kt)
65+
6. Binary Search Tree – [solution](src/main/kotlin/ru/romanow/algorithms/BinarySearchTree.kt), [test](src/test/kotlin/ru/romanow/algorithms/BinarySearchTreeTest.kt)
66+
7. Pre-order Deep First Search Traversal – [solution](src/main/kotlin/ru/romanow/algorithms/PreOrderDeepFirstSearch.kt), [test](src/test/kotlin/ru/romanow/algorithms/PreOrderDeepFirstSearchTest.kt)
67+
8. In-order Deep First Search Traversal – [solution](src/main/kotlin/ru/romanow/algorithms/InOrderDeepFirstSearch.kt), [test](src/test/kotlin/ru/romanow/algorithms/InOrderDeepFirstSearchTest.kt)
68+
9. Post-order Deep First Search Traversal – [solution](src/main/kotlin/ru/romanow/algorithms/PostOrderDeepFirstSearch.kt), [test](src/test/kotlin/ru/romanow/algorithms/PostOrderDeepFirstSearchTest.kt)
69+
10. Breadth First Search Traversal – [solution](src/main/kotlin/ru/romanow/algorithms/BreadthFirstSearch.kt), [test](src/test/kotlin/ru/romanow/algorithms/BreadthFirstSearchTest.kt)
6570

6671
[//]: # (@formatter:on)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ru.romanow.algorithms
2+
3+
import ru.romanow.models.TreeNode
4+
import java.util.LinkedList
5+
6+
class BreadthFirstSearch {
7+
fun traverse(root: TreeNode?): List<Int> {
8+
val result = mutableListOf<Int>()
9+
if (root == null) {
10+
return result
11+
}
12+
13+
val queue = LinkedList<TreeNode>()
14+
queue.add(root)
15+
16+
while (queue.isNotEmpty()) {
17+
val node = queue.poll()
18+
result.add(node.value)
19+
node.left?.let { queue.add(it) }
20+
node.right?.let { queue.add(it) }
21+
}
22+
return result
23+
}
24+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ru.romanow.algorithms
2+
3+
import ru.romanow.models.TreeNode
4+
5+
class InOrderDeepFirstSearch {
6+
fun traverse(node: TreeNode?): List<Int> {
7+
if (node == null) {
8+
return emptyList()
9+
}
10+
return traverse(node.left) +
11+
listOf(node.value) +
12+
traverse(node.right)
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ru.romanow.algorithms
2+
3+
import ru.romanow.models.TreeNode
4+
5+
class PostOrderDeepFirstSearch {
6+
fun traverse(node: TreeNode?): List<Int> {
7+
if (node == null) {
8+
return emptyList()
9+
}
10+
return traverse(node.right) +
11+
traverse(node.left) +
12+
listOf(node.value)
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ru.romanow.algorithms
2+
3+
import ru.romanow.models.TreeNode
4+
5+
class PreOrderDeepFirstSearch {
6+
fun traverse(node: TreeNode?): List<Int> {
7+
if (node == null) {
8+
return emptyList()
9+
}
10+
return listOf(node.value) +
11+
traverse(node.left) +
12+
traverse(node.right)
13+
}
14+
}

src/main/kotlin/ru/romanow/algorithms/TreeTraversal.kt

Lines changed: 0 additions & 69 deletions
This file was deleted.

src/main/kotlin/ru/romanow/models/TreeNode.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
package ru.romanow.models
22

3-
import java.util.*
3+
import java.util.LinkedList
4+
import kotlin.collections.ArrayList
45

56
data class TreeNode(var value: Int) {
67
var left: TreeNode? = null
78
var right: TreeNode? = null
89
}
910

11+
fun printTree(node: TreeNode?, level: Int = 0) {
12+
if (node == null) return
13+
print(" ".repeat(level))
14+
println("├─ ${node.value}")
15+
printTree(node.left, level + 1)
16+
printTree(node.right, level + 1)
17+
}
18+
1019
fun buildListFromTree(root: TreeNode?): List<Int?> {
1120
val list = ArrayList<Int?>()
1221
if (root != null) {

src/test/kotlin/ru/romanow/algorithms/BinarySearchTreeTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.junit.jupiter.params.provider.Arguments
77
import org.junit.jupiter.params.provider.ArgumentsProvider
88
import org.junit.jupiter.params.provider.ArgumentsSource
99
import ru.romanow.models.buildTreeFromList
10+
import ru.romanow.models.printTree
1011
import java.util.stream.Stream
1112

1213
class BinarySearchTreeTest {
@@ -15,6 +16,8 @@ class BinarySearchTreeTest {
1516
@ParameterizedTest(name = "#{index} – Search {1} in tree {0}")
1617
fun flatten(items: List<Int?>, target: Int, result: Int?) {
1718
val root = buildTreeFromList(items)
19+
printTree(root)
20+
1821
val obj = BinarySearchTree()
1922
assertThat(obj.find(root, target)?.value).isEqualTo(result)
2023
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ru.romanow.algorithms
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.junit.jupiter.api.extension.ExtensionContext
5+
import org.junit.jupiter.params.ParameterizedTest
6+
import org.junit.jupiter.params.provider.Arguments
7+
import org.junit.jupiter.params.provider.ArgumentsProvider
8+
import org.junit.jupiter.params.provider.ArgumentsSource
9+
import ru.romanow.models.buildTreeFromList
10+
import ru.romanow.models.printTree
11+
import java.util.stream.Stream
12+
13+
class BreadthFirstSearchTest {
14+
15+
@ArgumentsSource(ValueProvider::class)
16+
@ParameterizedTest(name = "#{index} – Bfs {0} is {1}")
17+
fun flatten(items: List<Int?>, result: List<Int>) {
18+
val root = buildTreeFromList(items)
19+
printTree(root)
20+
21+
val obj = BreadthFirstSearch()
22+
assertThat(obj.traverse(root)).isEqualTo(result)
23+
}
24+
25+
internal class ValueProvider : ArgumentsProvider {
26+
override fun provideArguments(context: ExtensionContext): Stream<Arguments> =
27+
Stream.of(Arguments.of(listOf(10, 5, 15, 3, 7, 12, 20), listOf(10, 5, 15, 3, 7, 12, 20)))
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ru.romanow.algorithms
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.junit.jupiter.api.extension.ExtensionContext
5+
import org.junit.jupiter.params.ParameterizedTest
6+
import org.junit.jupiter.params.provider.Arguments
7+
import org.junit.jupiter.params.provider.ArgumentsProvider
8+
import org.junit.jupiter.params.provider.ArgumentsSource
9+
import ru.romanow.models.buildTreeFromList
10+
import ru.romanow.models.printTree
11+
import java.util.stream.Stream
12+
13+
class InOrderDeepFirstSearchTest {
14+
15+
@ArgumentsSource(ValueProvider::class)
16+
@ParameterizedTest(name = "#{index} – In-order dfs {0} is {1}")
17+
fun flatten(items: List<Int?>, result: List<Int>) {
18+
val root = buildTreeFromList(items)
19+
printTree(root)
20+
21+
val obj = InOrderDeepFirstSearch()
22+
assertThat(obj.traverse(root)).isEqualTo(result)
23+
}
24+
25+
internal class ValueProvider : ArgumentsProvider {
26+
override fun provideArguments(context: ExtensionContext): Stream<Arguments> =
27+
Stream.of(Arguments.of(listOf(10, 5, 15, 3, 7, 12, 20), listOf(3, 5, 7, 10, 12, 15, 20)))
28+
}
29+
}

0 commit comments

Comments
 (0)