++
++
++
++
++
++
++
+
+\ No newline at end of file
diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_16_05_2021_14_08_[Default_Changelist]1/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_16_05_2021_14_08_[Default_Changelist]1/shelved.patch
new file mode 100644
index 0000000..e69de29
diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_16_05_2021_14_08__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_16_05_2021_14_08__Default_Changelist_.xml
new file mode 100644
index 0000000..659cbc6
--- /dev/null
+++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_16_05_2021_14_08__Default_Changelist_.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..cd6a847
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1620734349569
+
+
+ 1620734349569
+
+
+ 1621080037672
+
+
+
+ 1621080037672
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/task1.py b/task1.py
new file mode 100644
index 0000000..23ca3f6
--- /dev/null
+++ b/task1.py
@@ -0,0 +1,87 @@
+"""
+Задание 1.
+Реализуйте кодирование строки "по Хаффману".
+У вас два пути:
+1) тема идет тяжело? тогда вы можете, опираясь на пример с урока, сделать свою!!! версию алгоритма
+Разрешается и приветствуется изменение имен переменных, выбор других коллекций, различные изменения
+и оптимизации.
+2) тема понятна? постарайтесь сделать свою реализацию.
+Вы можете реализовать задачу, например, через ООП или предложить иной подход к решению.
+"""
+
+# Реализовано через ООП
+
+
+from collections import Counter
+
+
+class Node:
+
+ def __init__(self, left, right):
+ self.left = left
+ self.right = right
+ self.frequency = self.left.frequency + self.right.frequency
+
+
+class Symbol:
+
+ def __init__(self, symbol, frequency):
+ self.symbol = symbol
+ self.frequency = frequency
+ self.code = ''
+
+ def __str__(self):
+ return self.symbol
+
+
+class Phrase:
+
+ def __init__(self, phrase):
+ self.tree = []
+ self.symbols = {}
+ self.frequency_count(phrase)
+ self.create_tree()
+ self.symbols_code(self.tree)
+ self.code = self.phrase_code(phrase)
+
+ def frequency_count(self, phrase):
+ count_dict = Counter(phrase)
+ for i in count_dict:
+ symbol = Symbol(i, count_dict[i])
+ self.tree.append(symbol)
+ self.symbols[i] = symbol
+ self.tree.sort(key=lambda k: f'{k.frequency}')
+
+ def frequency_sort(self, node):
+ self.tree.insert(0, node)
+ for i in range(len(self.tree) - 1):
+ if self.tree[i].frequency > self.tree[i + 1].frequency:
+ self.tree[i], self.tree[i + 1] = self.tree[i + 1], self.tree[i]
+ else:
+ break
+
+ def create_tree(self):
+ while len(self.tree) > 1:
+ node = Node(self.tree[0], self.tree[1])
+ self.tree = self.tree[2:]
+ self.frequency_sort(node)
+ self.tree = self.tree[0]
+
+ def symbols_code(self, tree, code=''):
+ if isinstance(tree, Symbol):
+ tree.code = code
+ else:
+ self.symbols_code(tree.left, code + '0')
+ self.symbols_code(tree.right, code + '1')
+
+ def phrase_code(self, phrase):
+ code = ''
+ for i in phrase:
+ code += ' ' + self.symbols[i].code
+ return code
+
+ def __str__(self):
+ return self.code
+
+
+print(Phrase(input('Введите текст: ')))
diff --git a/task2.py b/task2.py
new file mode 100644
index 0000000..6521eaa
--- /dev/null
+++ b/task2.py
@@ -0,0 +1,96 @@
+"""
+Задание 2.
+Доработайте пример структуры "дерево",
+рассмотренный на уроке.
+Предложите варианты доработки и оптимизации
+(например, валидация значений узлов в соответствии с требованиями для бинарного дерева).
+Поработайте с доработанной структурой, позапускайте на реальных данных - на клиентском коде.
+"""
+
+# Добавлена валидация значений левого и правого потомка для корня дерева. Я ещё думал как бы сделать валидацию для
+# всех последующих потомков, но для этого надо переписать половину скрипта, если не весь, и к тому же потом я посмотрел
+# пример и в нём этого нет, так что оставил валидацию только для правого и левого потомков корня.
+
+
+class BinaryTree:
+ def __init__(self, root_obj):
+ # корень
+ self.root = root_obj
+ # левый потомок
+ self.left_child = None
+ # правый потомок
+ self.right_child = None
+
+ # добавить левого потомка
+ def insert_left(self, new_node):
+ if new_node < self.get_root_val():
+ # если у узла нет левого потомка
+ if self.left_child is None:
+ # тогда узел просто вставляется в дерево
+ # формируется новое поддерево
+ self.left_child = BinaryTree(new_node)
+ # если у узла есть левый потомок
+ else:
+ # тогда вставляем новый узел
+ tree_obj = BinaryTree(new_node)
+ # и спускаем имеющегося потомка на один уровень ниже
+ tree_obj.left_child = self.left_child
+ self.left_child = tree_obj
+ else:
+ print("Impossible. Too big")
+
+ # добавить правого потомка
+ def insert_right(self, new_node):
+ if new_node > self.get_root_val():
+ # если у узла нет правого потомка
+ if self.right_child is None:
+ # тогда узел просто вставляется в дерево
+ # формируется новое поддерево
+ self.right_child = BinaryTree(new_node)
+ # если у узла есть правый потомок
+ else:
+ # тогда вставляем новый узел
+ tree_obj = BinaryTree(new_node)
+ # и спускаем имеющегося потомка на один уровень ниже
+ tree_obj.right_child = self.right_child
+ self.right_child = tree_obj
+ else:
+ print("Impossible. Too small")
+
+ # метод доступа к правому потомку
+ def get_right_child(self):
+ if self.right_child:
+ return self.right_child
+ else:
+ print('Нет правого потомка')
+
+ # метод доступа к левому потомку
+ def get_left_child(self):
+ if self.left_child:
+ return self.left_child
+ else:
+ print('Нет левого потомка')
+
+ # метод установки корня
+ def set_root_val(self, obj):
+ if self.left_child.root < obj < self.right_child.root:
+ self.root = obj
+ else:
+ print('Impossible value')
+
+ # метод доступа к корню
+ def get_root_val(self):
+ if self.root:
+ return self.root
+ else:
+ print('Нет корня')
+
+
+r = BinaryTree(8)
+r.insert_left(12)
+r.insert_left(4)
+r.insert_right(2)
+r.insert_right(12)
+print(r.get_root_val())
+print(r.left_child.get_left_child())
+print(r.left_child.get_right_child())
\ No newline at end of file