AutoSkill inverted_avl_tree_cpp
Реализация AVL-дерева на C++ с инвертированной логикой хранения (Left > Node > Right) и стандартным фактором баланса (Left - Right). Включает специфическую логику удаления через поиск минимума в правом поддереве и управление памятью.
git clone https://github.com/ECNU-ICALK/AutoSkill
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8_GLM4.7/inverted_avl_tree_cpp" ~/.claude/skills/ecnu-icalk-autoskill-inverted-avl-tree-cpp && rm -rf "$T"
SkillBank/ConvSkill/english_gpt4_8_GLM4.7/inverted_avl_tree_cpp/SKILL.mdinverted_avl_tree_cpp
Реализация AVL-дерева на C++ с инвертированной логикой хранения (Left > Node > Right) и стандартным фактором баланса (Left - Right). Включает специфическую логику удаления через поиск минимума в правом поддереве и управление памятью.
Prompt
Role & Objective
Ты C++ эксперт по структурам данных. Твоя задача — реализовать AVL-дерево с инвертированной логикой хранения элементов и специфическими требованиями к расчету баланса и удалению.
Operational Rules & Constraints
-
Структура узла (Node):
- Поля:
,long data
,long height
,long balance
,Node* left
,Node* right
.Node* parent - Инициализируй высоту нового узла как 1.
- Поля:
-
Логика хранения (Инверсия):
- В левом поддереве должны храниться элементы строго больше значения текущего узла (
).node->data - В правом поддереве должны храниться элементы строго меньше значения текущего узла.
- В левом поддереве должны храниться элементы строго больше значения текущего узла (
-
Расчет высоты (height):
- Если узел
, возвращай 0.nullptr - Иначе возвращай
.node->height
- Если узел
-
Расчет баланса (Balance):
- Формула:
.height(node->left) - height(node->right) - Это строгое требование.
- Формула:
-
Вставка (Insert):
- Если
, рекурсивно вставляй в левое поддерево.key > node->data - Если
, рекурсивно вставляй в правое поддерево.key < node->data - Если значение уже существует, верни указатель на текущий узел (игнорируй дубликаты).
- После вставки обнови высоту и баланс текущего узла.
- Выполни необходимые вращения для балансировки, если
.abs(balance) > 1 - Возвращай новый корень поддерева.
- Если
-
Поиск преемника (minValueNode):
- При удалении узла с двумя потомками, преемником является минимальный элемент в правом поддереве.
- Функция должна проходить по правым указателям (
), чтобы найти самый "глубокий" (минимальный) элемент в правом поддереве.current->right
-
Удаление (Delete):
- Рекурсивно ищи узел с ключом
(с учетом инвертированной логики поиска).key - Если узел не найден, верни исходный корень (изменений нет).
- Если узел найден:
- Если у узла 0 или 1 ребенок: удали узел, обнови связи родителя, освободи память.
- Если у узла 2 ребенка:
- Найди преемника с помощью логики из пункта 6 (минимум в правом поддереве).
- Скопируй данные (
) из преемника в удаляемый узел.data - Рекурсивно удали преемник из правого поддерева.
- После удаления (если дерево не пустое) обнови высоту узлов на пути обратного хода и выполни балансировку.
- Верни новый корень поддерева.
- Рекурсивно ищи узел с ключом
-
Проверка существования (Exists):
- Логика поиска должна соответствовать логике вставки:
ищи влево,key > node->data
ищи вправо.key < node->data - Верни
, если узел найден, иначеtrue
.false
- Логика поиска должна соответствовать логике вставки:
-
Ввод/Вывод (main):
- Считай количество операций
.n - В цикле обрабатывай команды:
: ВызовиA x
. Выведи баланс корня. Если дерево пустое, выведи 0.Insert
: ВызовиD x
. Важно: Если узел не был найден и удален, НЕ выводи ничего. Если удаление прошло успешно, выведи баланс корня.Delete
: ВызовиC x
. Выведи 'Y', если true, иначе 'N'.Exists
- Считай количество операций
Anti-Patterns
- НЕ используй
/freemalloc
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