Skip to content

Latest commit

 

History

History
53 lines (36 loc) · 5.55 KB

File metadata and controls

53 lines (36 loc) · 5.55 KB

Вставка в АВЛ-дерево

Вставка в АВЛ-дерево вершины V с ключом X при условии, что такой вершины в этом дереве нет, осуществляется следующим образом:

  • находится вершина W, ребенком которой должна стать вершина V;
  • вершина V делается ребенком вершины W;
  • производится подъем от вершины W к корню, при этом, если какая-то из вершин несбалансирована, производится, в зависимости от значения баланса, левый или правый поворот.

Первый этап нуждается в пояснении. Спуск до будущего родителя вершины V осуществляется, начиная от корня, следующим образом:

  • Пусть ключ текущей вершины равен Y.
  • Если X < Y и у текущей вершины есть левый ребенок, переходим к левому ребенку.
  • Если X < Y и у текущей вершины нет левого ребенка, то останавливаемся, текущая вершина будет родителем новой вершины.
  • Если X > Y и у текущей вершины есть правый ребенок, переходим к правому ребенку.
  • Если X > Y и у текущей вершины нет правого ребенка, то останавливаемся, текущая вершина будет родителем новой вершины.

Отдельно рассматривается следующий крайний случай -- если до вставки дерево было пустым, то вставка новой вершины осуществляется проще: новая вершина становится корнем дерева.

Формат входного файла

Входной файл содержит описание двоичного дерева, а также ключ вершины, которую требуется вставить в дерево.

В первой строке файла находится число N (0 \leqslant N \leqslant 2 \cdot 10^5) -- число вершин в дереве. В последующих N строках файла находятся описания вершин дерева. В (i + 1)-ой строке файла (1 \leqslant i leqslant N) находится описание i-ой вершины, состоящее из трех чисел K_i, L_i, R_i, разделенных пробелами -- ключа в i-ой вершине (|K_i| \leqslant 10^9), номера левого ребенка i-ой вершины (i < L_i \leqslant N или L_i = 0, если левого ребенка нет) и номера правого ребенка i-ой вершины (i < R_i \leqslant N или R_i = 0, если правого ребенка нет).

Все ключи различны. Гарантируется, что данное дерево является корректным АВЛ-деревом.

В последней строке содержится число X (|X| \leqslant 10^9) -- ключ вершины, которую требуется вставить в дерево. Гарантируется, что такой вершины в дереве нет.

Формат выходного файла

Выведите в том же формате дерево после осуществления операции вставки. Нумерация вершин может быть произвольной при условии соблюдения формата.

Пример

input.txt

2
3 0 2
4 0 0
5

output.txt

3
4 2 3
3 0 0
5 0 0

Решение

AVLTreeInsert.scala