From 53a51e2337822b422e487bfdbde6e788fac7c325 Mon Sep 17 00:00:00 2001 From: Lenovo Date: Fri, 13 Dec 2024 22:37:54 +0300 Subject: [PATCH] Lab30-31 --- students/23K0565/23K0565-p30-1/pom.xml | 13 ++ .../practice/s0000001/n1/BinTreeOper.java | 113 ++++++++++++++ .../mirea/practice/s0000001/n1/HuffmanN.java | 11 ++ .../ru/mirea/practice/s0000001/n1/Node.java | 13 ++ .../ru/mirea/practice/s0000001/n2/HufAlg.java | 47 ++++++ .../ru/mirea/practice/s0000001/n2/HufNod.java | 11 ++ students/23K0565/23K0565-p30-2/pom.xml | 13 ++ .../ru/mirea/practice/s0000001/BsTree.java | 92 ++++++++++++ .../java/ru/mirea/practice/s0000001/Node.java | 13 ++ students/23K0565/23K0565-p31/pom.xml | 13 ++ .../ru/mirea/practice/s0000001/Tree23.java | 138 ++++++++++++++++++ 11 files changed, 477 insertions(+) create mode 100644 students/23K0565/23K0565-p30-1/pom.xml create mode 100644 students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/BinTreeOper.java create mode 100644 students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/HuffmanN.java create mode 100644 students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/Node.java create mode 100644 students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufAlg.java create mode 100644 students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufNod.java create mode 100644 students/23K0565/23K0565-p30-2/pom.xml create mode 100644 students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/BsTree.java create mode 100644 students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/Node.java create mode 100644 students/23K0565/23K0565-p31/pom.xml create mode 100644 students/23K0565/23K0565-p31/src/main/java/ru/mirea/practice/s0000001/Tree23.java diff --git a/students/23K0565/23K0565-p30-1/pom.xml b/students/23K0565/23K0565-p30-1/pom.xml new file mode 100644 index 000000000..ace914866 --- /dev/null +++ b/students/23K0565/23K0565-p30-1/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0565 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0565-p30-1 + 30.1 практическая + diff --git a/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/BinTreeOper.java b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/BinTreeOper.java new file mode 100644 index 000000000..dc46921bd --- /dev/null +++ b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/BinTreeOper.java @@ -0,0 +1,113 @@ +package ru.mirea.practice.s0000001.n1; + +import java.util.PriorityQueue; + +public class BinTreeOper { + Node root; + + int height(Node n) { + if (n == null) { + return 0; + } + return Math.max(height(n.left), height(n.right)) + 1; + } + + boolean lookup(Node n, int target) { + if (n == null) { + return false; + } + if (n.data == target) { + return true; + } + if (target < n.data) { + return lookup(n.left, target); + } else { + return lookup(n.right, target); + } + } + + void reverse(Node n) { + if (n == null) { + return; + } + Node tmp = n.left; + n.left = n.right; + n.right = tmp; + reverse(n.left); + reverse(n.right); + } + + int maxWidth(Node n) { + int maxW = 0; + int h = height(n); + for (int i = 1; i <= h; i++) { + int w = getWidth(n, i); + if (w > maxW) { + maxW = w; + } + } + return maxW; + } + + int getWidth(Node n, int lvl) { + if (n == null) { + return 0; + } + if (lvl == 1) { + return 1; + } + return getWidth(n.left, lvl - 1) + getWidth(n.right, lvl - 1); + } + + int size(Node n) { + if (n == null) { + return 0; + } + return size(n.left) + 1 + size(n.right); + } + + boolean sameTree(Node a, Node b) { + if (a == null && b == null) { + return true; + } + if (a != null && b != null) { + return a.data == b.data && sameTree(a.left, b.left) && sameTree(a.right, b.right); + } + return false; + } + + static HuffmanN buildHuffTree(int[] freqs) { + PriorityQueue pq = new PriorityQueue<>((a, b) -> a.freq - b.freq); + for (int f : freqs) { + pq.add(new HuffmanN(f)); + } + + while (pq.size() > 1) { + HuffmanN a = pq.poll(); + HuffmanN b = pq.poll(); + HuffmanN sum = new HuffmanN(a.freq + b.freq); + sum.left = a; + sum.right = b; + pq.add(sum); + } + return pq.poll(); + } + + public static void main(String[] args) { + BinTreeOper tree = new BinTreeOper(); + tree.root = new Node(5); + tree.root.left = new Node(3); + tree.root.right = new Node(8); + tree.root.left.left = new Node(1); + tree.root.left.right = new Node(4); + + System.out.println("Высота дерева: " + tree.height(tree.root)); + System.out.println("Поиск 4: " + tree.lookup(tree.root, 4)); + System.out.println("Ширина дерева: " + tree.maxWidth(tree.root)); + System.out.println("Количество узлов: " + tree.size(tree.root)); + + int[] freqs = {2, 3, 5, 7, 11, 13, 17}; + HuffmanN root = buildHuffTree(freqs); + System.out.println("Корень дерева Хаффмана: " + root.freq); + } +} diff --git a/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/HuffmanN.java b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/HuffmanN.java new file mode 100644 index 000000000..4e0138439 --- /dev/null +++ b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/HuffmanN.java @@ -0,0 +1,11 @@ +package ru.mirea.practice.s0000001.n1; + +public class HuffmanN { + int freq; + HuffmanN left; + HuffmanN right; + + public HuffmanN(int freq) { + this.freq = freq; + } +} diff --git a/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/Node.java b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/Node.java new file mode 100644 index 000000000..53fd8f3fe --- /dev/null +++ b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n1/Node.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s0000001.n1; + +public class Node { + int data; + Node left; + Node right; + + public Node(int d) { + data = d; + left = null; + right = null; + } +} diff --git a/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufAlg.java b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufAlg.java new file mode 100644 index 000000000..17e50b584 --- /dev/null +++ b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufAlg.java @@ -0,0 +1,47 @@ +package ru.mirea.practice.s0000001.n2; + +import java.util.PriorityQueue; + +public final class HufAlg { + + private HufAlg() { + throw new UnsupportedOperationException("Utility class"); + } + + static HufNod buildHuffmanTree(int[] freqs) { + PriorityQueue pq = new PriorityQueue<>((a, b) -> a.freq - b.freq); + for (int f : freqs) { + pq.add(new HufNod(f)); + } + + while (pq.size() > 1) { + HufNod a = pq.poll(); + HufNod b = pq.poll(); + HufNod sum = new HufNod(a.freq + b.freq); + sum.left = a; + sum.right = b; + pq.add(sum); + } + return pq.poll(); + } + + static void printHuffmanTree(HufNod root, String code) { + if (root == null) { + return; + } + if (root.left == null && root.right == null) { + System.out.println("Символ: " + root.freq + " Код: " + code); + } + printHuffmanTree(root.left, code + "0"); + printHuffmanTree(root.right, code + "1"); + } + + public static void main(String[] args) { + int[] freqs = {2, 3, 5, 7, 11, 13, 17}; + + HufNod root = buildHuffmanTree(freqs); + System.out.println("Корень дерева Хаффмана: " + root.freq); + System.out.println("Коды Хаффмана для символов:"); + printHuffmanTree(root, ""); + } +} diff --git a/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufNod.java b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufNod.java new file mode 100644 index 000000000..2f5987c1b --- /dev/null +++ b/students/23K0565/23K0565-p30-1/src/main/java/ru/mirea/practice/s0000001/n2/HufNod.java @@ -0,0 +1,11 @@ +package ru.mirea.practice.s0000001.n2; + +public class HufNod { + int freq; + HufNod left; + HufNod right; + + public HufNod(int freq) { + this.freq = freq; + } +} diff --git a/students/23K0565/23K0565-p30-2/pom.xml b/students/23K0565/23K0565-p30-2/pom.xml new file mode 100644 index 000000000..bee7cb90f --- /dev/null +++ b/students/23K0565/23K0565-p30-2/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0565 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0565-p30-2 + 30.2 практическая + diff --git a/students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/BsTree.java b/students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/BsTree.java new file mode 100644 index 000000000..603e02c9d --- /dev/null +++ b/students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/BsTree.java @@ -0,0 +1,92 @@ +package ru.mirea.practice.s0000001; + +public class BsTree { + Node root; + + public void insert(int value) { + root = insertRec(root, value); + } + + private Node insertRec(Node root, int value) { + if (root == null) { + return new Node(value); + } + if (value < root.data) { + root.left = insertRec(root.left, value); + } else if (value > root.data) { + root.right = insertRec(root.right, value); + } + return root; + } + + public void inorder() { + inorderRec(root); + System.out.println(); + } + + private void inorderRec(Node root) { + if (root != null) { + inorderRec(root.left); + System.out.print(root.data + " "); + inorderRec(root.right); + } + } + + public void delete(int value) { + root = deleteRec(root, value); + } + + private Node deleteRec(Node root, int value) { + if (root == null) { + return null; + } + + if (value < root.data) { + root.left = deleteRec(root.left, value); + } else if (value > root.data) { + root.right = deleteRec(root.right, value); + } else { + if (root.left == null) { + return root.right; + } else if (root.right == null) { + return root.left; + } + + root.data = minValue(root.right); + root.right = deleteRec(root.right, root.data); + } + return root; + } + + private int minValue(Node root) { + int minVal = root.data; + while (root.left != null) { + root = root.left; + minVal = root.data; + } + return minVal; + } + + public void deleteTree() { + root = null; + System.out.println("Дерево удалено."); + } + + public static void main(String[] args) { + BsTree tree = new BsTree(); + + int[] values = {50, 30, 70, 20, 40, 60, 80, 10, 35, 65}; + for (int val : values) { + tree.insert(val); + } + + System.out.println("Содержимое дерева до удаления такое:"); + tree.inorder(); + + tree.delete(40); + System.out.println("Содержимое дерева после удаления узла со значением 40:"); + tree.inorder(); + + tree.deleteTree(); + } +} diff --git a/students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/Node.java b/students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/Node.java new file mode 100644 index 000000000..8ee4d0e4c --- /dev/null +++ b/students/23K0565/23K0565-p30-2/src/main/java/ru/mirea/practice/s0000001/Node.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s0000001; + +public class Node { + int data; + Node left; + Node right; + + public Node(int data) { + this.data = data; + this.left = null; + this.right = null; + } +} diff --git a/students/23K0565/23K0565-p31/pom.xml b/students/23K0565/23K0565-p31/pom.xml new file mode 100644 index 000000000..2e38ff0a1 --- /dev/null +++ b/students/23K0565/23K0565-p31/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0565 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0565-p31 + 31 практическая + diff --git a/students/23K0565/23K0565-p31/src/main/java/ru/mirea/practice/s0000001/Tree23.java b/students/23K0565/23K0565-p31/src/main/java/ru/mirea/practice/s0000001/Tree23.java new file mode 100644 index 000000000..decf27d43 --- /dev/null +++ b/students/23K0565/23K0565-p31/src/main/java/ru/mirea/practice/s0000001/Tree23.java @@ -0,0 +1,138 @@ +package ru.mirea.practice.s0000001; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Scanner; + +public class Tree23 { + static class Node { + int key1; + int key2; + Node left; + Node mid; + Node right; + boolean isLeaf; + List data; + + Node(int k, String info) { + key1 = k; + isLeaf = true; + data = new ArrayList<>(); + data.add(info); + } + } + + Node root; + + public void add(int key, String info) { + if (root == null) { + root = new Node(key, info); + } else { + Node newRoot = insert(root, key, info); + if (newRoot != null) { + root = newRoot; + } + } + } + + private Node insert(Node node, int key, String info) { + if (node.isLeaf) { + if (node.data.size() < 2) { + node.data.add(info); + if (key < node.key1) { + node.key2 = node.key1; + node.key1 = key; + } else { + node.key2 = key; + } + return null; + } else { + return splitLeaf(node, key, info); + } + } else { + Node res; + if (key < node.key1) { + res = insert(node.left, key, info); + } else if (node.key2 == 0 || key < node.key2) { + res = insert(node.mid, key, info); + } else { + res = insert(node.right, key, info); + } + + if (res != null) { + return splitInternal(node, res); + } + } + return null; + } + + private Node splitLeaf(Node node, int key, String info) { + List keys = new ArrayList<>(); + keys.add(node.key1); + keys.add(node.key2); + keys.add(key); + Collections.sort(keys); + final Node newNode = new Node(keys.get(2), info); + node.key1 = keys.get(0); + node.key2 = 0; + node.data.clear(); + node.data.add("Key: " + keys.get(0)); + return newNode; + } + + private Node splitInternal(Node parent, Node newChild) { + Node newRoot = new Node(parent.key2, ""); + newRoot.left = parent; + newRoot.mid = newChild; + return newRoot; + } + + public void print() { + printTree(root); + System.out.println(); + } + + private void printTree(Node node) { + if (node != null) { + if (node.isLeaf) { + System.out.print(node.key1 + " "); + if (node.key2 != 0) { + System.out.print(node.key2 + " "); + } + } else { + printTree(node.left); + System.out.print(node.key1 + " "); + printTree(node.mid); + if (node.key2 != 0) { + System.out.print(node.key2 + " "); + printTree(node.right); + } + } + } + } + + public static void main(String[] args) { + Tree23 tree = new Tree23(); + try (Scanner sc = new Scanner(System.in)) { + while (true) { + System.out.println("Введите команду (A - добавить, L - вывести, E - выход):"); + String cmd = sc.next(); + if ("A".equals(cmd)) { + System.out.println("Введите ключ:"); + int key = sc.nextInt(); + System.out.println("Введите информацию:"); + sc.nextLine(); // Поглощаем перевод строки + String info = sc.nextLine(); + tree.add(key, info); + } else if ("L".equals(cmd)) { + tree.print(); + } else if ("E".equals(cmd)) { + break; + } else { + System.out.println("Неизвестная команда:("); + } + } + } + } +}