Skip to content

Feature/translate tree #289

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
4 changes: 4 additions & 0 deletions src/data-structures/tree/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Tree

_Read this in other languages:_
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md)

* [Binary Search Tree](binary-search-tree)
* [AVL Tree](avl-tree)
* [Red-Black Tree](red-black-tree)
31 changes: 31 additions & 0 deletions src/data-structures/tree/README.ru-RU.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Дерево

* [Двоичное Дерево Поиска](binary-search-tree)
* [АВЛ Дерево](avl-tree)
* [Красно-черное дерево](red-black-tree)
* [Сегментное дерево](segment-tree)
* [Дерево Фенвика](fenwick-tree)

Дерево – это структура данных, представляющая собой совокупность элементов и отношений, образующих иерархическую
структуру этих элементов. Каждый элемент дерева называется узлом (вершиной) дерева. Узлы дерева
соединены направленными дугами, которые называют ветвями дерева. Начальный узел дерева называют корнем дерева, ему
соответствует нулевой уровень. Листьями дерева называют вершины, в которые входит одна ветвь и не выходит ни одной
ветви.

Каждое дерево обладает следующими свойствами:

* существует узел, в который не входит ни одной ветви (корень);
* в каждую вершину, кроме корня, входит одна ветвь.

Деревья особенно часто используют на практике при изображении различных иерархий. Например, генеалогическое дерево
или структурная схема организации.

Простое неупорядоченное дерево; на этой диаграмме узел с меткой 7 имеет два дочерних элемента с метками 2 и 6 и
одного родителя с меткой 2. У корневого узла в верхней части нет родителя.

![Дерево](https://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_tree.svg)

## Ссылки

- [Intuit](http://www.intuit.ru/studies/higher_education/3407/courses/504/lecture/11458)
- [YouTube](https://www.youtube.com/watch?v=kVLYZz-R6H0)
3 changes: 3 additions & 0 deletions src/data-structures/tree/avl-tree/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# AVL Tree

_Read this in other languages:_
[_Русский_](README.ru-RU.md)

In computer science, an **AVL tree** (named after inventors
Adelson-Velsky and Landis) is a self-balancing binary search
tree. It was the first such data structure to be invented.
34 changes: 34 additions & 0 deletions src/data-structures/tree/avl-tree/README.ru-RU.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# АВЛ дерево

АВЛ-дерево — сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота её двух поддеревьев
различается не более чем на 1. АВЛ дерево является самобалансирующимся: если в любое время они отличаются более чем на
один, выполняется вращение для восстановления этого свойства.

АВЛ — аббревиатура, образованная первыми буквами фамилий создателей (советских учёных) Адельсон-Вельского Георгия
Максимовича и Ландиса Евгения Михайловича.

Поиск, вставка и удаление занимают время `O (log n)` как в среднем, так и в наихудшем случаях, где n - количество узлов
в дереве до операции. Для вставок и удалений может потребоваться сбалансировать дерево одним или несколькими поворотами
дерева.

### Вращение АВЛ деревьев

Большое левое вращение. Данное вращение используется тогда, когда (высота b-поддерева — высота L) = 2 и высота
с-поддерева > высота R.

![АВЛ дерево](https://upload.wikimedia.org/wikipedia/ru/1/16/AVL_BR.GIF)

Малое правое вращение. Данное вращение используется тогда, когда (высота b-поддерева — высота R) = 2 и высота
С <= высота L.

![АВЛ дерево](https://upload.wikimedia.org/wikipedia/ru/e/e8/AVL_LL.GIF)

Большое правое вращение. Данное вращение используется тогда, когда (высота b-поддерева — высота R) = 2 и высота
c-поддерева > высота L.

![АВЛ дерево](https://upload.wikimedia.org/wikipedia/ru/7/74/AVL_BL.GIF)

## Ссылки

* [Wikipedia](https://ru.wikipedia.org/wiki/%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE)
* [Youtube](https://www.youtube.com/watch?v=9cUwGI_F9jU)
3 changes: 3 additions & 0 deletions src/data-structures/tree/binary-search-tree/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Binary Search Tree

_Read this in other languages:_
[_Русский_](README.ru-RU.md)

In computer science, **binary search trees** (BST), sometimes called
ordered or sorted binary trees, are a particular type of container:
data structures that store "items" (such as numbers, names etc.)
276 changes: 276 additions & 0 deletions src/data-structures/tree/binary-search-tree/README.ru-RU.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
# Двоичное дерево поиска

Двоичное дерево — иерархическая структура данных, в которой каждый узел имеет не более двух потомков (детей). Как
правило, первый называется родительским узлом, а дети называются левым и правым наследниками. Двоичное дерево не
является упорядоченным ориентированным деревом.

Двоичное дерево поиска — это двоичное дерево, для которого выполняются следующие дополнительные условия (свойства дерева
поиска):

* Оба поддерева — левое и правое — являются двоичными деревьями поиска,
* У всех узлов левого поддерева произвольного узла X значения ключей данных меньше, нежели значение ключа данных самого
узла X,
* У всех узлов правого поддерева произвольного узла X значения ключей данных больше либо равны, нежели значение ключа
данных самого узла X.

Двоичное дерево поиска позволяет осуществлять быстрый поиск, добавление и удаление элементов и может использоваться для
реализации либо динамических наборов элементов, либо таблиц поиска, которые позволяют найти элемент по его ключу
(например, найти номер телефона человека по имени).

Двоичное дерево поиска хранит свои ключи в отсортированном порядке, так что поиск и другие операции могут использовать
принцип бинарного поиска: при поиске ключа в дереве (или места для вставки нового ключа) происходит обход дерева от корня
до листа. В процессе обхода сопоставляются ключи хранящиеся в узлах дерева, и принимается решение - продолжить поиск в
левом или правом поддеревьях. В среднем это означает, что каждое сравнение позволяет операциям пропустить около половины
дерева. Так что каждый поиск, вставка или удаление занимает время, пропорциональное логарифму числа элементов,
хранящихся в дереве. Это намного лучше, чем линейное время, необходимое для поиска элементов по ключу в
(несортированном) массиве. Но медленнее, чем соответствующие операции с хеш-таблицами.

Двоичное дерево поиска размером 9 и глубиной 3, 8 в корне.

![Двоичное дерево поиска](https://upload.wikimedia.org/wikipedia/commons/d/da/Binary_search_tree.svg)

## Псевдокод базовых операций

### Вставка

```text
insert(value)
Pre: value has passed custom type checks for type T
Post: value has been placed in the correct location in the tree
if root = ø
root ← node(value)
else
insertNode(root, value)
end if
end insert
```

```text
insertNode(current, value)
Pre: current is the node to start from
Post: value has been placed in the correct location in the tree
if value < current.value
if current.left = ø
current.left ← node(value)
else
InsertNode(current.left, value)
end if
else
if current.right = ø
current.right ← node(value)
else
InsertNode(current.right, value)
end if
end if
end insertNode
```

### Поиск

```text
contains(root, value)
Pre: root is the root node of the tree, value is what we would like to locate
Post: value is either located or not
if root = ø
return false
end if
if root.value = value
return true
else if value < root.value
return contains(root.left, value)
else
return contains(root.right, value)
end if
end contains
```


### Удаление

```text
remove(value)
Pre: value is the value of the node to remove, root is the node of the BST
count is the number of items in the BST
Post: node with value is removed if found in which case yields true, otherwise false
nodeToRemove ← findNode(value)
if nodeToRemove = ø
return false
end if
parent ← findParent(value)
if count = 1
root ← ø
else if nodeToRemove.left = ø and nodeToRemove.right = ø
if nodeToRemove.value < parent.value
parent.left ← nodeToRemove.right
else
parent.right ← nodeToRemove.right
end if
else if nodeToRemove.left != ø and nodeToRemove.right != ø
next ← nodeToRemove.right
while next.left != ø
next ← next.left
end while
if next != nodeToRemove.right
remove(next.value)
nodeToRemove.value ← next.value
else
nodeToRemove.value ← next.value
nodeToRemove.right ← nodeToRemove.right.right
end if
else
if nodeToRemove.left = ø
next ← nodeToRemove.right
else
next ← nodeToRemove.left
end if
if root = nodeToRemove
root = next
else if parent.left = nodeToRemove
parent.left = next
else if parent.right = nodeToRemove
parent.right = next
end if
end if
count ← count - 1
return true
end remove
```

### Поиск родителя

```text
findParent(value, root)
Pre: value is the value of the node we want to find the parent of
root is the root node of the BST and is != ø
Post: a reference to the prent node of value if found; otherwise ø
if value = root.value
return ø
end if
if value < root.value
if root.left = ø
return ø
else if root.left.value = value
return root
else
return findParent(value, root.left)
end if
else
if root.right = ø
return ø
else if root.right.value = value
return root
else
return findParent(value, root.right)
end if
end if
end findParent
```

### Поиск узла

```text
findNode(root, value)
Pre: value is the value of the node we want to find the parent of
root is the root node of the BST
Post: a reference to the node of value if found; otherwise ø
if root = ø
return ø
end if
if root.value = value
return root
else if value < root.value
return findNode(root.left, value)
else
return findNode(root.right, value)
end if
end findNode
```

### Поиск минимума

```text
findMin(root)
Pre: root is the root node of the BST
root = ø
Post: the smallest value in the BST is located
if root.left = ø
return root.value
end if
findMin(root.left)
end findMin
```

### Поиск максимума

```text
findMax(root)
Pre: root is the root node of the BST
root = ø
Post: the largest value in the BST is located
if root.right = ø
return root.value
end if
findMax(root.right)
end findMax
```

### Обход

#### Симметричный обход

```text
inorder(root)
Pre: root is the root node of the BST
Post: the nodes in the BST have been visited in inorder
if root = ø
inorder(root.left)
yield root.value
inorder(root.right)
end if
end inorder
```

#### Прямой обход

```text
preorder(root)
Pre: root is the root node of the BST
Post: the nodes in the BST have been visited in preorder
if root = ø
yield root.value
preorder(root.left)
preorder(root.right)
end if
end preorder
```

#### Обратный обход

```text
postorder(root)
Pre: root is the root node of the BST
Post: the nodes in the BST have been visited in postorder
if root = ø
postorder(root.left)
postorder(root.right)
yield root.value
end if
end postorder
```

## Сложность

### Временная сложность

| Чтение | Поиск | Вставка | Удаление |
| :-------: | :-------: | :-------: | :-------: |
| O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) |

### Пространственная сложность

O(n)

## Ссылки

- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0)
- [YouTube](https://www.youtube.com/watch?v=VddwdRVYpuw)
3 changes: 3 additions & 0 deletions src/data-structures/tree/fenwick-tree/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Fenwick Tree / Binary Indexed Tree

_Read this in other languages:_
[_Русский_](README.ru-RU.md)

A **Fenwick tree** or **binary indexed tree** is a data
structure that can efficiently update elements and
calculate prefix sums in a table of numbers.
Loading