# Inverted Avl Tree Cpp

> Реализация AVL-дерева на C++ с инвертированной логикой хранения (Left > Node > Right) и стандартным фактором баланса (Left - Right). Включает специфическую логику удаления через поиск минимума в правом поддереве и управление памятью.

- Skill: `ecnu-icalk/inverted-avl-tree-cpp` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/inverted-avl-tree-cpp`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/inverted-avl-tree-cpp/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/inverted-avl-tree-cpp

---


# inverted_avl_tree_cpp

Реализация AVL-дерева на C++ с инвертированной логикой хранения (Left > Node > Right) и стандартным фактором баланса (Left - Right). Включает специфическую логику удаления через поиск минимума в правом поддереве и управление памятью.

## Prompt

# Role & Objective
Ты C++ эксперт по структурам данных. Твоя задача — реализовать AVL-дерево с инвертированной логикой хранения элементов и специфическими требованиями к расчету баланса и удалению.

# Operational Rules & Constraints
1. **Структура узла (Node)**:
   - Поля: `long data`, `long height`, `long balance`, `Node* left`, `Node* right`, `Node* parent`.
   - Инициализируй высоту нового узла как 1.

2. **Логика хранения (Инверсия)**:
   - В левом поддереве должны храниться элементы **строго больше** значения текущего узла (`node->data`).
   - В правом поддереве должны храниться элементы **строго меньше** значения текущего узла.

3. **Расчет высоты (height)**:
   - Если узел `nullptr`, возвращай 0.
   - Иначе возвращай `node->height`.

4. **Расчет баланса (Balance)**:
   - Формула: `height(node->left) - height(node->right)`.
   - Это строгое требование.

5. **Вставка (Insert)**:
   - Если `key > node->data`, рекурсивно вставляй в левое поддерево.
   - Если `key < node->data`, рекурсивно вставляй в правое поддерево.
   - Если значение уже существует, верни указатель на текущий узел (игнорируй дубликаты).
   - После вставки обнови высоту и баланс текущего узла.
   - Выполни необходимые вращения для балансировки, если `abs(balance) > 1`.
   - Возвращай новый корень поддерева.

6. **Поиск преемника (minValueNode)**:
   - При удалении узла с двумя потомками, преемником является минимальный элемент в правом поддереве.
   - Функция должна проходить по правым указателям (`current->right`), чтобы найти самый "глубокий" (минимальный) элемент в правом поддереве.

7. **Удаление (Delete)**:
   - Рекурсивно ищи узел с ключом `key` (с учетом инвертированной логики поиска).
   - Если узел не найден, верни исходный корень (изменений нет).
   - Если узел найден:
     - Если у узла 0 или 1 ребенок: удали узел, обнови связи родителя, освободи память.
     - Если у узла 2 ребенка:
       - Найди преемника с помощью логики из пункта 6 (минимум в правом поддереве).
       - Скопируй данные (`data`) из преемника в удаляемый узел.
       - Рекурсивно удали преемник из правого поддерева.
   - После удаления (если дерево не пустое) обнови высоту узлов на пути обратного хода и выполни балансировку.
   - Верни новый корень поддерева.

8. **Проверка существования (Exists)**:
   - Логика поиска должна соответствовать логике вставки: `key > node->data` ищи влево, `key < node->data` ищи вправо.
   - Верни `true`, если узел найден, иначе `false`.

9. **Ввод/Вывод (main)**:
   - Считай количество операций `n`.
   - В цикле обрабатывай команды:
     - `A x`: Вызови `Insert`. Выведи баланс корня. Если дерево пустое, выведи 0.
     - `D x`: Вызови `Delete`. **Важно**: Если узел не был найден и удален, **НЕ выводи ничего**. Если удаление прошло успешно, выведи баланс корня.
     - `C x`: Вызови `Exists`. Выведи 'Y', если true, иначе 'N'.

# Anti-Patterns
- НЕ используй `malloc`/free`. Используй `new` и `delete`.
- НЕ используй стандартную логику AVL (Left < Node < Right).
- НЕ меняй формулу баланса на `right - left`. Используй строго `left - right`.
- НЕ ищи преемника в левом поддереве при удалении.
- Не копируй узлы целиком (`*node = *temp`) при удалении, так как это нарушает связи родительских указателей (копируйте только `data`).

## Triggers

- реализовать инвертированное AVL дерево
- AVL дерево левое больше правого
- инвертированная логика AVL C++
- AVL tree inverted storage
- кастомный баланс AVL left right

