Skip to content

Commit 89a825b

Browse files
committed
Add main operations to BST
1 parent 616448a commit 89a825b

File tree

5 files changed

+119
-33
lines changed

5 files changed

+119
-33
lines changed

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

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,69 @@ package ru.romanow.algorithms
33
import ru.romanow.models.TreeNode
44

55
class BinarySearchTree {
6-
fun find(root: TreeNode?, target: Int): TreeNode? {
7-
return when {
8-
root == null -> null
9-
target == root.value -> root
10-
target < root.value -> find(root.left, target)
11-
else -> find(root.right, target)
6+
internal var root: TreeNode? = null
7+
8+
fun get(key: Int): Int? {
9+
var current = root
10+
while (current != null) {
11+
current = when {
12+
key < current.key -> current.left
13+
key > current.key -> current.right
14+
else -> return current.value
15+
}
16+
}
17+
return null
18+
}
19+
20+
fun put(key: Int, value: Int = key) {
21+
root = insert(root, key, value)
22+
}
23+
24+
fun remove(key: Int) {
25+
root = remove(root, key)
26+
}
27+
28+
private fun insert(node: TreeNode?, key: Int, value: Int = key): TreeNode {
29+
if (node == null) {
30+
return TreeNode(key, value)
31+
}
32+
when {
33+
key < node.key -> node.left = insert(node.left, key, value)
34+
key > node.key -> node.right = insert(node.right, key, value)
35+
else -> node.value = value
36+
}
37+
return node
38+
}
39+
40+
private fun remove(node: TreeNode?, key: Int): TreeNode? {
41+
if (node == null) {
42+
return null
43+
}
44+
when {
45+
key < node.key -> node.left = remove(node.left, key)
46+
key > node.key -> node.right = remove(node.right, key)
47+
else -> {
48+
if (node.left == null) {
49+
return node.right
50+
}
51+
if (node.right == null) {
52+
return node.left
53+
}
54+
55+
val minNode = findMin(node.right!!)
56+
node.key = minNode.key
57+
node.value = minNode.value
58+
node.right = remove(node.right, minNode.key)
59+
}
60+
}
61+
return node
62+
}
63+
64+
private fun findMin(node: TreeNode): TreeNode {
65+
var current = node
66+
while (current.left != null) {
67+
current = current.left!!
1268
}
69+
return current
1370
}
1471
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package ru.romanow.algorithms
2+
3+
import ru.romanow.models.TNode
4+
5+
class RedBlackTree {
6+
private var root: TreeNode? = null
7+
8+
fun get(key: Int): Int? {
9+
var current = root
10+
while (current != null) {
11+
current = when {
12+
key < current.key -> current.left
13+
key > current.key -> current.right
14+
else -> return current.value
15+
}
16+
}
17+
return null
18+
}
19+
20+
internal class TreeNode(
21+
override var key: Int,
22+
override var value: Int,
23+
var color: Boolean = false,
24+
override var left: TreeNode?,
25+
override var right: TreeNode?
26+
) : TNode<TreeNode>
27+
28+
}

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
11
package ru.romanow.models
22

3-
class ListNode {
4-
var value: Int? = null
5-
var next: ListNode? = null
6-
7-
constructor(value: Int) {
8-
this.value = value
9-
}
10-
11-
constructor(value: Int, next: ListNode?) {
12-
this.value = value
13-
this.next = next
14-
}
15-
3+
open class ListNode(var value: Int?, var next: ListNode? = null) {
164
override fun toString(): String {
175
return "ListNode(value=$value, next=${next?.value})"
186
}

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,37 @@
11
package ru.romanow.models
22

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

6-
data class TreeNode(var value: Int) {
7-
var left: TreeNode? = null
8-
var right: TreeNode? = null
5+
interface TNode<T : TNode<T>> {
6+
var key: Int
7+
var value: Int
8+
var left: T?
9+
var right: T?
910
}
1011

11-
fun printTree(node: TreeNode?, level: Int = 0) {
12+
class TreeNode(
13+
override var key: Int,
14+
override var value: Int = key,
15+
override var left: TreeNode? = null,
16+
override var right: TreeNode? = null
17+
) : TNode<TreeNode> {
18+
override fun toString(): String {
19+
return "TreeNode(key=$key, value=$value, left=${left?.key}, right=${right?.key})"
20+
}
21+
}
22+
23+
fun printTree(node: TNode<*>?, level: Int = 0) {
1224
if (node == null) return
1325
print(" ".repeat(level))
14-
println("├─ ${node.value}")
26+
println("├─ $node")
1527
printTree(node.left, level + 1)
1628
printTree(node.right, level + 1)
1729
}
1830

19-
fun buildListFromTree(root: TreeNode?): List<Int?> {
31+
fun buildListFromTree(root: TNode<*>?): List<Int?> {
2032
val list = ArrayList<Int?>()
2133
if (root != null) {
22-
val queue = LinkedList<TreeNode?>()
34+
val queue = LinkedList<TNode<*>?>()
2335
queue.add(root)
2436
while (queue.isNotEmpty()) {
2537
val head = queue.pop()
@@ -38,7 +50,7 @@ fun buildListFromTree(root: TreeNode?): List<Int?> {
3850
fun buildTreeFromList(values: List<Int?>, index: Int = 0): TreeNode? {
3951
var node: TreeNode? = null
4052
if (index < values.size && values[index] != null) {
41-
node = TreeNode(value = values[index]!!)
53+
node = TreeNode(key = values[index]!!)
4254
node.left = buildTreeFromList(values, 2 * index + 1)
4355
node.right = buildTreeFromList(values, 2 * index + 2)
4456
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@ import org.junit.jupiter.params.ParameterizedTest
66
import org.junit.jupiter.params.provider.Arguments
77
import org.junit.jupiter.params.provider.ArgumentsProvider
88
import org.junit.jupiter.params.provider.ArgumentsSource
9-
import ru.romanow.models.buildTreeFromList
109
import java.util.stream.Stream
1110

1211
class BinarySearchTreeTest {
1312

1413
@ArgumentsSource(ValueProvider::class)
1514
@ParameterizedTest(name = "#{index} – Search {1} in tree {0}")
16-
fun flatten(items: List<Int>, target: Int, result: Int?) {
17-
val root = buildTreeFromList(items)
15+
fun flatten(items: List<Int>, key: Int, result: Int?) {
1816
val obj = BinarySearchTree()
19-
assertThat(obj.find(root, target)?.value).isEqualTo(result)
17+
items.forEach { obj.put(it) }
18+
assertThat(obj.get(key)).isEqualTo(result)
19+
obj.remove(key)
20+
assertThat(obj.get(key)).isNull()
2021
}
2122

2223
internal class ValueProvider : ArgumentsProvider {

0 commit comments

Comments
 (0)