Skip to content
This repository was archived by the owner on Dec 28, 2024. It is now read-only.

Commit 333a218

Browse files
committed
Практики 30
1 parent 611cc0b commit 333a218

File tree

8 files changed

+306
-0
lines changed

8 files changed

+306
-0
lines changed

students/23K0155/23K0155-p30/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<artifactId>23K0155</artifactId>
7+
<groupId>ru.mirea.practice</groupId>
8+
<version>2024.1</version>
9+
<relativePath>../pom.xml</relativePath>
10+
</parent>
11+
<artifactId>23K0155-p30</artifactId>
12+
<description>Трицатое задание</description>
13+
</project>
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package ru.mirea.practice.s23k0155;
2+
3+
public class BinaryTree {
4+
private Node root;
5+
6+
public BinaryTree(Node node) {
7+
this.root = node;
8+
}
9+
10+
public void add(int element) {
11+
root = addElement(root, element);
12+
}
13+
14+
private Node addElement(Node node,int element) {
15+
if (node == null) {
16+
return new Node(element);
17+
}
18+
if (node.value > element) {
19+
node.left = addElement(node.left, element);
20+
} else if (node.value < element) {
21+
node.rirht = addElement(node.rirht, element);
22+
}
23+
return node;
24+
}
25+
26+
public void printTree() {
27+
helpPrint(root);
28+
System.out.println();
29+
}
30+
31+
private void helpPrint(Node node) {
32+
if (node != null) {
33+
helpPrint(node.left);
34+
System.out.print(node.value + " ");
35+
helpPrint(node.rirht);
36+
}
37+
}
38+
39+
public int height(Node node) {
40+
41+
if (node == null) {
42+
return 0;
43+
}
44+
45+
int h1 = 0;
46+
if (node.left != null) {
47+
h1 = height(node.left);
48+
}
49+
50+
int h2 = 0;
51+
if (node.rirht != null) {
52+
h2 = height(node.rirht);
53+
}
54+
return Math.max(h1, h2) + 1;
55+
}
56+
57+
public void reverse(Node node) {
58+
if (node != null) {
59+
if (node.left != null && node.rirht != null) {
60+
Node temp = node.left;
61+
node.left = node.rirht;
62+
node.rirht = temp;
63+
} else if (node.left != null && node.rirht == null) {
64+
reverse(node.left);
65+
} else if (node.left == null && node.rirht != null) {
66+
reverse(node.rirht);
67+
}
68+
}
69+
}
70+
71+
public int lookup(Node node, int target) {
72+
if (node == null) {
73+
return 0;
74+
} else {
75+
if (target == node.value) {
76+
return 1;
77+
} else {
78+
if (target < node.value) {
79+
return lookup(node.left, target);
80+
} else {
81+
return lookup(node.rirht, target);
82+
}
83+
}
84+
}
85+
}
86+
87+
public int getWidth(Node node, int level) {
88+
89+
if (node == null) {
90+
return 0;
91+
}
92+
93+
if (level == 1) {
94+
return 1;
95+
} else if (level > 1) {
96+
return getWidth(node.left, level - 1) + getWidth(node.rirht, level - 1);
97+
}
98+
return 0;
99+
}
100+
101+
public int getMaxWidth(Node root) {
102+
int maxWdth = 0;
103+
int width = 0;
104+
for (int i = 0; i < height(root); i++) {
105+
width = getWidth(root, i);
106+
if (width > maxWdth) {
107+
maxWdth = width;
108+
}
109+
}
110+
return maxWdth;
111+
}
112+
113+
public int size(Node node) {
114+
if (node == null) {
115+
return 0;
116+
} else {
117+
return size(node.left) + size(node.rirht) + 1;
118+
}
119+
}
120+
121+
public boolean sameTree(Node tree1, Node tree2) {
122+
if (tree1 == null && tree2 == null) {
123+
return true;
124+
} else if (tree1 != null && tree2 != null) {
125+
return tree1.value == tree2.value && sameTree(tree1.left, tree2.left)
126+
&& sameTree(tree1.rirht, tree2.rirht);
127+
} else {
128+
return false;
129+
}
130+
}
131+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package ru.mirea.practice.s23k0155;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public abstract class Haffman {
7+
public static void main(String[] args) {
8+
9+
String string = "AAABBC";
10+
HashMap<Character, Integer> elements = new HashMap<>();
11+
for (char letter : string.toCharArray()) {
12+
elements.put(letter, elements.getOrDefault(letter, 0) + 1);
13+
}
14+
15+
int counter = 0;
16+
for (Map.Entry<Character, Integer> entry : elements.entrySet()) {
17+
counter++;
18+
System.out.println("Символ: " + entry.getKey() + " кол. повторов - " + entry.getValue());
19+
}
20+
21+
Integer[] nums = new Integer[counter];
22+
Character[] sybols = new Character[counter];
23+
24+
int i = 0;
25+
for (Map.Entry<Character, Integer> entry : elements.entrySet()) {
26+
nums[i] = (int) entry.getValue();
27+
sybols[i] = (char) entry.getKey();
28+
i++;
29+
}
30+
31+
for (i = 0; i < counter; i++) {
32+
int pos = i;
33+
int min = nums[i];
34+
char s = sybols[i];
35+
for (int j = i + 1; j < counter; j++) {
36+
if (nums[j] < min) {
37+
pos = j;
38+
min = nums[j];
39+
s = sybols[j];
40+
}
41+
}
42+
nums[pos] = nums[i];
43+
nums[i] = min;
44+
sybols[pos] = sybols[i];
45+
sybols[i] = s;
46+
}
47+
48+
for (i = 0; i < counter; i++) {
49+
System.out.println(nums[i] + " " + sybols[i]);
50+
}
51+
52+
HaffmansNode root = HaffmansNode.huffmansTree(elements);
53+
Map<Character, String> hafCode = new HashMap<>();
54+
HaffmansNode.generateCode(root, "", hafCode);
55+
56+
System.out.println("Закодированные символы:");
57+
for (Map.Entry<Character, String> entry : hafCode.entrySet()) {
58+
System.out.println(entry.getKey() + " - " + entry.getValue());
59+
}
60+
}
61+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package ru.mirea.practice.s23k0155;
2+
3+
import java.util.Comparator;
4+
import java.util.Map;
5+
import java.util.PriorityQueue;
6+
7+
public class HaffmansNode {
8+
char symbol;
9+
int freq;
10+
HaffmansNode left;
11+
HaffmansNode right;
12+
13+
public HaffmansNode(char symbol, int freq) {
14+
this.symbol = symbol;
15+
this.freq = freq;
16+
}
17+
18+
public HaffmansNode(int freq, HaffmansNode left, HaffmansNode right) {
19+
this.symbol = '0';
20+
this.freq = freq;
21+
this.left = left;
22+
this.right = right;
23+
}
24+
25+
public static HaffmansNode huffmansTree(Map<Character, Integer> element) {
26+
PriorityQueue<HaffmansNode> queue = new PriorityQueue<>(Comparator.comparingInt(node -> node.freq));
27+
28+
for (Map.Entry<Character, Integer> entry : element.entrySet()) {
29+
queue.add(new HaffmansNode(entry.getKey(), entry.getValue()));
30+
}
31+
while (queue.size() > 1) {
32+
HaffmansNode left = queue.poll();
33+
HaffmansNode right = queue.poll();
34+
HaffmansNode parent = new HaffmansNode(left.freq + right.freq, left, right);
35+
queue.add(parent);
36+
}
37+
return queue.poll();
38+
}
39+
40+
public static void generateCode(HaffmansNode node, String code, Map<Character, String> hafCode) {
41+
if (node == null) {
42+
return;
43+
}
44+
if (node.left == null && node.right == null) {
45+
hafCode.put(node.symbol, code);
46+
return;
47+
}
48+
generateCode(node.left, code + "0", hafCode);
49+
generateCode(node.right, code + "1", hafCode);
50+
}
51+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package ru.mirea.practice.s23k0155;
2+
3+
public class Node {
4+
int value;
5+
Node left;
6+
Node rirht;
7+
8+
public Node(int value) {
9+
this.value = value;
10+
left = null;
11+
rirht = null;
12+
}
13+
14+
public int getNode() {
15+
return value;
16+
}
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package ru.mirea.practice.s23k0155;
2+
3+
public abstract class Test {
4+
public static void main(String[] args) {
5+
System.out.println("Первое дерево:");
6+
Node root = new Node(10);
7+
BinaryTree tree1 = new BinaryTree(root);
8+
tree1.add(15);
9+
tree1.add(2);
10+
tree1.add(9);
11+
tree1.printTree();
12+
System.out.println("Высота дероева: " + tree1.height(root));
13+
System.out.println("Макимальная ширина дероева: " + tree1.getMaxWidth(root));
14+
tree1.reverse(root);
15+
System.out.println("Реверсированное дерево");
16+
tree1.printTree();
17+
18+
19+
}
20+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
1. Написать программу на языке Java, использующая функции, разработанные выше, для выполнения операций над бинарным
2+
деревом.
3+
2. Реализовать алгоритм Хаффмана
4+
5+
6+
7+
8+
1. Сначала создать бинарное поисковое действие из 10 узлов, затем содержимое дерева распечатать
9+
2. из него удалить один узел.
10+
3. После этого выполняется еще одна распечатка, чтобы проверить, как прошло удаление
11+
4. дерево удаляется уже полностью с освобождением памяти.

students/23K0155/pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,7 @@
4141
<module>23K0155-p27</module>
4242
<module>23K0155-p28</module>
4343
<module>23K0155-p29</module>
44+
<module>23K0155-p30</module>
45+
<module>23K0155-p31</module>
4446
</modules>
4547
</project>

0 commit comments

Comments
 (0)