diff --git a/lab04/pom.xml b/lab04/pom.xml
new file mode 100644
index 0000000..35fab1c
--- /dev/null
+++ b/lab04/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+
+ org.example
+ lab04
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+ junit
+ junit
+ RELEASE
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter
+ RELEASE
+ test
+
+
+
+
\ No newline at end of file
diff --git a/lab04/src/main/java/org/example/BSTNode.java b/lab04/src/main/java/org/example/BSTNode.java
new file mode 100644
index 0000000..3578538
--- /dev/null
+++ b/lab04/src/main/java/org/example/BSTNode.java
@@ -0,0 +1,114 @@
+package org.example;
+
+public class BSTNode {
+ private Node root;
+ private class Node {
+ private int key;
+ private String val;
+ private Node left,right;
+ private int size;
+
+ public Node(int key, String val, int initSize) {
+ this.key = key;
+ this.val = val;
+ size = initSize;
+ }
+ }
+
+ public int getSize() {
+ return getSize(root);
+ }
+ private int getSize(Node node) {
+ if(node == null)
+ return 0;
+ else
+ return node.size;
+ }
+
+ public void insertValue(int key, String val) {
+ root = insertValue(root, key, val);
+ }
+ private Node insertValue(Node node, int key, String val) {
+ if (node == null) {
+ return new Node(key,val,1);
+ }
+
+ if (key > node.key) {
+ node.right = insertValue(node.right,key,val);
+ } else if (key < node.key) {
+ node.left = insertValue(node.left,key,val);
+ } else {
+ node.val = val;
+ }
+
+ node.size = getSize(node.left) + getSize(node.right) + 1;
+
+ return node;
+ }
+
+ public void deleteValue(int key) {
+ root = deleteValue(root, key);
+ }
+ private Node deleteValue(Node node, int key) {
+ if (node == null) return null;
+
+ if (key > node.key) node.right = deleteValue(node.right, key);
+ else if (key < node.key) node.left = deleteValue(node.left, key);
+ else {
+ if (node.right == null) return node.left;
+ else if (node.left == null) return node.right;
+
+ root.key = minValue(root.right);
+
+ root.right = deleteValue(root.right, root.key);
+ }
+
+ node.size = getSize(node.left) + getSize(node.right) + 1;
+
+ return node;
+ }
+
+ private int minValue(Node node) {
+ int minValue = node.key;
+ while (node.left != null) {
+ minValue = node.left.key;
+ node = node.left;
+ }
+
+ return minValue;
+ }
+
+ public String searchValue(int key){
+ return searchValue(root, key);
+ }
+ private String searchValue (Node root, int key)
+ {
+ if (root == null) {
+ return null;
+ }
+
+ if (key == root.key){
+ return root.val;
+ }
+
+ if (key > root.key)
+ return searchValue(root.right, key);
+
+ return searchValue(root.left, key);
+ }
+
+ public void depthOrderTraversal() {
+ depthTraversal(root);
+ }
+
+ private void depthTraversal(Node node) {
+ if (node != null) {
+ System.out.print("Key: " + node.key + " Value: " + node.val + "\n");
+ depthTraversal(node.left);
+ depthTraversal(node.right);
+ }
+ }
+
+
+}
+
diff --git a/lab04/src/test/java/org/example/BSTTest.java b/lab04/src/test/java/org/example/BSTTest.java
new file mode 100644
index 0000000..70ed4a9
--- /dev/null
+++ b/lab04/src/test/java/org/example/BSTTest.java
@@ -0,0 +1,110 @@
+package org.example;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.Test;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class BSTTest {
+ Map tree;
+
+ @BeforeEach
+ void treeInit() {
+ tree = new HashMap<>();
+
+ tree.put(11,"Одинадцять");
+ tree.put(19,"Дев'ятнадцять");
+ tree.put(15,"П'ятнадцять");
+ tree.put(25,"Двадцять п'ять");
+ tree.put(12,"Дванадцять");
+ tree.put(13,"Тринадцять");
+ tree.put(16,"Шістнадцять");
+ tree.put(7,"Сім");
+ tree.put(24,"Двадцять чотири");
+ tree.put(20,"Двадцять");
+ tree.put(10,"Десять");
+ tree.put(21,"Двадцять один");
+ tree.put(8,"Вісім");
+ tree.put(17,"Сімнадцять");
+ tree.put(18,"Вісімнадцять");
+ tree.put(9,"Дев'ять");
+ tree.put(26,"Двадцять шість");
+ tree.put(23,"Двадцять три");
+ tree.put(14,"Чотирнадцять");
+ tree.put(22,"Двадцять два");
+ }
+
+ private BSTNode mapTransferBstnode() {
+ BSTNode node = new BSTNode();
+
+ for (Map.Entry item: tree.entrySet()) {
+ node.insertValue(item.getKey(), item.getValue());
+ }
+ return node;
+ }
+
+ @Test
+ void Test1() {
+ BSTNode node = mapTransferBstnode();
+
+ Assertions.assertEquals(20,tree.size());
+ }
+
+ @Test
+ void Test2() {
+ BSTNode node = mapTransferBstnode();
+
+ node.depthOrderTraversal();
+ System.out.println();
+ Assertions.assertEquals(20,tree.size());
+ }
+
+ @Test
+ void Test3() {
+ BSTNode node = mapTransferBstnode();
+
+ Assertions.assertEquals("Двадцять один",node.searchValue(21));
+ Assertions.assertNull(node.searchValue(90));
+ Assertions.assertEquals("Дев'ятнадцять",node.searchValue(19));
+ Assertions.assertNull(node.searchValue(45));
+ }
+
+ @Test
+ void Test4() {
+ BSTNode node = new BSTNode();
+
+ for (Map.Entry item: tree.entrySet()) {
+ if(item.getKey()!=20) {
+ node.insertValue(item.getKey(), item.getValue());
+ }
+ }
+
+
+ node.insertValue(20,"Двадцять");
+
+ System.out.println(node.searchValue(20));
+ Assertions.assertEquals("Двадцять",node.searchValue(20));
+ node.insertValue(20,"Інше двадцять");
+
+ node.depthOrderTraversal();
+ System.out.println();
+ Assertions.assertEquals(20, node.getSize());
+
+ System.out.println(node.searchValue(20));
+ Assertions.assertEquals("Інше двадцять",node.searchValue(20));
+ }
+ @Test
+ void Test5() {
+ BSTNode node = mapTransferBstnode();
+
+ node.deleteValue(14);
+
+ node.depthOrderTraversal();
+ System.out.println();
+ Assertions.assertEquals(19, node.getSize());
+ Assertions.assertNull(node.searchValue(14));
+ }
+}
\ No newline at end of file
diff --git a/lab04/target/classes/classpath.index b/lab04/target/classes/classpath.index
new file mode 100644
index 0000000..30ff5f1
Binary files /dev/null and b/lab04/target/classes/classpath.index differ
diff --git a/lab04/target/classes/org/example/BSTNode$Node.class b/lab04/target/classes/org/example/BSTNode$Node.class
new file mode 100644
index 0000000..cef943d
Binary files /dev/null and b/lab04/target/classes/org/example/BSTNode$Node.class differ
diff --git a/lab04/target/classes/org/example/BSTNode.class b/lab04/target/classes/org/example/BSTNode.class
new file mode 100644
index 0000000..349d644
Binary files /dev/null and b/lab04/target/classes/org/example/BSTNode.class differ
diff --git a/lab04/target/classes/org/example/Main.class b/lab04/target/classes/org/example/Main.class
new file mode 100644
index 0000000..87a9433
Binary files /dev/null and b/lab04/target/classes/org/example/Main.class differ
diff --git a/lab04/target/test-classes/classpath.index b/lab04/target/test-classes/classpath.index
new file mode 100644
index 0000000..ccd84c4
Binary files /dev/null and b/lab04/target/test-classes/classpath.index differ
diff --git a/lab04/target/test-classes/org/example/BSTTest.class b/lab04/target/test-classes/org/example/BSTTest.class
new file mode 100644
index 0000000..7b2b145
Binary files /dev/null and b/lab04/target/test-classes/org/example/BSTTest.class differ