Операции вставки и удаления

Гоша: Я понял, как искать уже существующие в дереве элементы.
А если нужно записать новый или удалить старый элемент?
Тимофей: Всё очень похоже на поиск! Начнём с операции вставки.
Мы также спускаемся вниз по дереву, сравнивая каждое значение с тем, которое хотим вставить.
Если значение нового элемента меньше значения в текущем узле, то перейдём к его левому потомку. Если левого потомка нет, создадим его, поместив в него узел со значением нового элемента.
Иначе перейдём к правому потомку. Если правого потомка нет, создадим его, поместив в него узел со значением нового элемента.
Рассмотрим этот алгоритм на примере:
image
Дано дерево, в которое нужно вставить новый элемент 14. Порядок действий:
  1. Сравним 14 со значением в корне. 14 больше 10, перейдём к правому потомку.
  2. Сравним 14 и 15. 14 меньше 15, перейдём к левому потомку.
  3. Сравним 12 и 14. 12 меньше 14, перейдём к правому потомку. Но у вершины со значением 12 отсутствует потомок. Значит, создадим его и присвоим значение 14.
Получим такое дерево:
image
Гоша: Здорово! Это так же просто, как искать элементы в дереве. Осталось разобраться с удалением и я стану специалистом по деревьям!
Тимофей: Дендрологом?
Гоша: (Обиженно) Алгоритмическим...
Тимофей: С удалением всё немного сложнее.
Возможны 3 случая:
  1. Нет потомков, удалим узел родителя.
image
  1. Один потомок, переставим узел родителя на потомка.
image
Гоша: А в чём сложность?
Тимофей: А что, по-твоему, нужно делать, если у вершины два потомка?
Гоша задумался.
Что делать, если у вершины два потомка?
  1. Два потомка, найдём самый левый лист в правом поддереве и заменим им удаляемый.
image
Гоша: Ну да, это посложнее будет... Но вроде понятно!
Решите задачи C, D: https://contest.yandex.ru/contest/18996/problems/C/.