diff --git a/students/23K0815/23K0815-p30/pom.xml b/students/23K0815/23K0815-p30/pom.xml
new file mode 100644
index 000000000..e9269bf4f
--- /dev/null
+++ b/students/23K0815/23K0815-p30/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0815
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0815-p30
+ Массивы
+
diff --git a/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/SearchTree.java b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/SearchTree.java
new file mode 100644
index 000000000..13203c271
--- /dev/null
+++ b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/SearchTree.java
@@ -0,0 +1,89 @@
+package ru.mirea.practice.s0000001.task1;
+
+class SearchTree {
+ private TreeNode root;
+
+ public SearchTree() {
+ root = null;
+ }
+
+ public void insert(int key) {
+ root = insertNode(root, key);
+ }
+
+ private TreeNode insertNode(TreeNode current, int key) {
+ if (current == null) {
+ current = new TreeNode(key);
+ return current;
+ }
+ if (key < current.value) {
+ current.leftChild = insertNode(current.leftChild, key);
+ } else if (key > current.value) {
+ current.rightChild = insertNode(current.rightChild, key);
+ }
+ return current;
+ }
+
+ public void printTree() {
+ inOrderTraversal(root);
+ System.out.println();
+ }
+
+ private void inOrderTraversal(TreeNode current) {
+ if (current != null) {
+ inOrderTraversal(current.leftChild);
+ System.out.print(current.value + " ");
+ inOrderTraversal(current.rightChild);
+ }
+ }
+
+ public void delete(int key) {
+ root = deleteNode(root, key);
+ }
+
+ private TreeNode deleteNode(TreeNode current, int key) {
+ if (current == null) {
+ return current;
+ }
+
+ if (key < current.value) {
+ current.leftChild = deleteNode(current.leftChild, key);
+ } else if (key > current.value) {
+ current.rightChild = deleteNode(current.rightChild, key);
+ } else {
+ if (current.leftChild == null) {
+ return current.rightChild;
+ } else if (current.rightChild == null) {
+ return current.leftChild;
+ }
+
+ current.value = getMinValue(current.rightChild);
+ current.rightChild = deleteNode(current.rightChild, current.value);
+ }
+ return current;
+ }
+
+ private int getMinValue(TreeNode current) {
+ int minValue = current.value;
+ while (current.leftChild != null) {
+ minValue = current.leftChild.value;
+ current = current.leftChild;
+ }
+ return minValue;
+ }
+
+ public void clear() {
+ root = clearAll(root);
+ }
+
+ private TreeNode clearAll(TreeNode current) {
+ if (current == null) {
+ return null;
+ }
+ current.leftChild = clearAll(current.leftChild);
+ current.rightChild = clearAll(current.rightChild);
+ current = null;
+ return current;
+ }
+}
+
diff --git a/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/TreeNode.java b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/TreeNode.java
new file mode 100644
index 000000000..b48a85017
--- /dev/null
+++ b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/TreeNode.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s0000001.task1;
+
+class TreeNode {
+ int value;
+ TreeNode leftChild;
+ TreeNode rightChild;
+
+ TreeNode(int key) {
+ value = key;
+ leftChild = rightChild = null;
+ }
+}
\ No newline at end of file
diff --git a/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task2/HuffmanAlgorithm.java b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task2/HuffmanAlgorithm.java
new file mode 100644
index 000000000..f69862412
--- /dev/null
+++ b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task2/HuffmanAlgorithm.java
@@ -0,0 +1,64 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.Map;
+import java.util.PriorityQueue;
+import java.util.TreeMap;
+
+public abstract class HuffmanAlgorithm {
+
+ public static Map generateFrequencyMap(String input) {
+ Map frequencyMap = new TreeMap<>();
+ for (char character : input.toCharArray()) {
+ frequencyMap.put(character, frequencyMap.getOrDefault(character, 0) + 1);
+ }
+ return frequencyMap;
+ }
+
+ public static Map constructHuffmanTree(Map frequencyMap) {
+ PriorityQueue priorityQueue = new PriorityQueue<>();
+ for (Map.Entry entry : frequencyMap.entrySet()) {
+ priorityQueue.add(new HuffmanTreeNode(entry.getKey(), entry.getValue()));
+ }
+
+ while (priorityQueue.size() > 1) {
+ HuffmanTreeNode leftNode = priorityQueue.poll();
+ HuffmanTreeNode rightNode = priorityQueue.poll();
+ HuffmanTreeNode parentNode = new HuffmanTreeNode('\0', leftNode.frequency + rightNode.frequency);
+ parentNode.left = leftNode;
+ parentNode.right = rightNode;
+ priorityQueue.add(parentNode);
+ }
+
+ Map huffmanCodes = new TreeMap<>();
+ createHuffmanCodes(priorityQueue.peek(), "", huffmanCodes);
+
+ return huffmanCodes;
+ }
+
+ public static void createHuffmanCodes(HuffmanTreeNode node, String code, Map huffmanCodes) {
+ if (node != null) {
+ if (node.character != '\0') {
+ huffmanCodes.put(node.character, code);
+ }
+ createHuffmanCodes(node.left, code + "0", huffmanCodes);
+ createHuffmanCodes(node.right, code + "1", huffmanCodes);
+ }
+ }
+
+ public static class HuffmanTreeNode implements Comparable {
+ char character;
+ int frequency;
+ HuffmanTreeNode left;
+ HuffmanTreeNode right;
+
+ HuffmanTreeNode(char character, int frequency) {
+ this.character = character;
+ this.frequency = frequency;
+ }
+
+ @Override
+ public int compareTo(HuffmanTreeNode other) {
+ return Integer.compare(this.frequency, other.frequency);
+ }
+ }
+}
\ No newline at end of file
diff --git a/students/23K0815/23K0815-p31/pom.xml b/students/23K0815/23K0815-p31/pom.xml
new file mode 100644
index 000000000..a2d376ff7
--- /dev/null
+++ b/students/23K0815/23K0815-p31/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0815
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0815-p31
+ Массивы
+
diff --git a/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerDisplay.java b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerDisplay.java
new file mode 100644
index 000000000..828a93ff6
--- /dev/null
+++ b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerDisplay.java
@@ -0,0 +1,69 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+public abstract class BurgerDisplay {
+
+ public static void displayBurgerTree(BurgerNode root) {
+ if (root == null) {
+ return;
+ }
+
+ int height = calculateHeight(root);
+ Deque queue = new ArrayDeque<>();
+ queue.offer(root);
+ int level = 0;
+
+ while (!queue.isEmpty()) {
+ int levelSize = queue.size();
+ int spacesBefore = (int) Math.pow(2, height - level - 1) - 1;
+ int spacesBetween = (int) Math.pow(2, height - level) - 1;
+
+ System.out.print(" ".repeat(spacesBefore));
+
+ for (int i = 0; i < levelSize; i++) {
+ BurgerNode node = queue.poll();
+ System.out.print(node.patty);
+
+ if (i < levelSize - 1) {
+ System.out.print(" ".repeat(spacesBetween));
+ }
+
+ if (node.lettuce != null) {
+ queue.offer(node.lettuce);
+ }
+ if (node.tomato != null) {
+ queue.offer(node.tomato);
+ }
+ if (node.onion != null) {
+ queue.offer(node.onion);
+ }
+ }
+ System.out.println();
+ level++;
+ }
+ }
+
+ // Function to compute the height of the burger tree
+ private static int calculateHeight(BurgerNode root) {
+ if (root == null) {
+ return 0;
+ }
+ return 1 + Math.max(Math.max(calculateHeight(root.lettuce), calculateHeight(root.tomato)), calculateHeight(root.onion));
+ }
+
+ public static void main(String[] args) {
+ BurgerNode root = new BurgerNode(5);
+ root.lettuce = new BurgerNode(2);
+ root.tomato = new BurgerNode(3);
+ root.onion = new BurgerNode(6);
+ root.lettuce.lettuce = new BurgerNode(1);
+ root.lettuce.onion = new BurgerNode(2);
+ root.tomato.lettuce = new BurgerNode(4);
+ root.onion.lettuce = new BurgerNode(5);
+ root.onion.onion = new BurgerNode(6);
+
+ displayBurgerTree(root);
+ }
+}
\ No newline at end of file
diff --git a/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerNode.java b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerNode.java
new file mode 100644
index 000000000..f9fc1a062
--- /dev/null
+++ b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerNode.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s0000001.task1;
+
+class BurgerNode {
+ int patty;
+ BurgerNode lettuce;
+ BurgerNode tomato;
+ BurgerNode onion;
+
+ BurgerNode(int patty) {
+ this.patty = patty;
+ }
+}
+
diff --git a/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerTree.java b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerTree.java
new file mode 100644
index 000000000..ba308b29a
--- /dev/null
+++ b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerTree.java
@@ -0,0 +1,34 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class BurgerTree {
+ public static void displayBurgerTree(BurgerNode node) {
+ if (node == null) {
+ return;
+ }
+
+ System.out.print(node.patty);
+
+ if (node.lettuce != null && node.onion != null) {
+ System.out.print("-");
+ }
+
+ System.out.print(" ");
+ displayBurgerTree(node.lettuce);
+ displayBurgerTree(node.tomato);
+ displayBurgerTree(node.onion);
+ }
+
+ public static void main(String[] args) {
+ BurgerNode root = new BurgerNode(5);
+ root.lettuce = new BurgerNode(2);
+ root.tomato = new BurgerNode(3);
+ root.onion = new BurgerNode(6);
+ root.lettuce.lettuce = new BurgerNode(1);
+ root.lettuce.onion = new BurgerNode(2);
+ root.tomato.lettuce = new BurgerNode(4);
+ root.onion.lettuce = new BurgerNode(5);
+ root.onion.onion = new BurgerNode(6);
+
+ displayBurgerTree(root);
+ }
+}
diff --git a/students/23K0815/23K0815-p32/pom.xml b/students/23K0815/23K0815-p32/pom.xml
new file mode 100644
index 000000000..eaa628f02
--- /dev/null
+++ b/students/23K0815/23K0815-p32/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0815
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0815-p32
+ Массивы
+
diff --git a/students/23K0815/23K0815-p32/src/main/java/ru/mirea/practice/s0000001/task1/PermutationGenerator.java b/students/23K0815/23K0815-p32/src/main/java/ru/mirea/practice/s0000001/task1/PermutationGenerator.java
new file mode 100644
index 000000000..fb497222a
--- /dev/null
+++ b/students/23K0815/23K0815-p32/src/main/java/ru/mirea/practice/s0000001/task1/PermutationGenerator.java
@@ -0,0 +1,82 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public final class PermutationGenerator {
+
+ private PermutationGenerator() {
+ // Prevent instantiation
+ }
+
+ static class Item {
+ int number;
+ boolean isMovingRight;
+
+ Item(int number) {
+ this.number = number;
+ this.isMovingRight = false; // Initially set to move left
+ }
+ }
+
+ public static void main(String[] args) {
+ int count = 10; // Changed from 4 to 10
+ createPermutations(count);
+ }
+
+ public static void createPermutations(int count) {
+ List- items = new ArrayList<>();
+ for (int i = 1; i <= count; i++) {
+ items.add(new Item(i));
+ }
+
+ displayPermutation(items);
+
+ while (true) {
+ int indexOfLargestMovable = findLargestMovable(items);
+ if (indexOfLargestMovable == -1) {
+ break;
+ }
+
+ Item largestItem = items.get(indexOfLargestMovable);
+ int targetIndex = largestItem.isMovingRight ? indexOfLargestMovable + 1 : indexOfLargestMovable - 1;
+ swapItems(items, indexOfLargestMovable, targetIndex);
+
+ for (Item item : items) {
+ if (item.number > largestItem.number) {
+ item.isMovingRight = !item.isMovingRight; // Change direction
+ }
+ }
+
+ displayPermutation(items);
+ }
+ }
+
+ private static int findLargestMovable(List
- items) {
+ int movableIndex = -1;
+ for (int i = 0; i < items.size(); i++) {
+ Item currentItem = items.get(i);
+ int neighborIndex = currentItem.isMovingRight ? i + 1 : i - 1;
+
+ if (neighborIndex >= 0 && neighborIndex < items.size() && currentItem.number > items.get(neighborIndex).number) {
+ if (movableIndex == -1 || currentItem.number > items.get(movableIndex).number) {
+ movableIndex = i;
+ }
+ }
+ }
+ return movableIndex;
+ }
+
+ private static void swapItems(List
- items, int firstIndex, int secondIndex) {
+ Item temp = items.get(firstIndex);
+ items.set(firstIndex, items.get(secondIndex));
+ items.set(secondIndex, temp);
+ }
+
+ private static void displayPermutation(List
- items) {
+ for (Item item : items) {
+ System.out.print(item.number + " ");
+ }
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/students/23K0815/pom.xml b/students/23K0815/pom.xml
index 1d67a20e0..f5111b40a 100644
--- a/students/23K0815/pom.xml
+++ b/students/23K0815/pom.xml
@@ -37,5 +37,8 @@
23K0815-p27
23K0815-p28
23K0815-p29
+ 23K0815-p30
+ 23K0815-p31
+ 23K0815-p32