Итак, прежде чем читать некоторые основные концепции информатики.
- Бинарное дерево - это динамически размещаемая структура (обычно используется для упорядоченного хранения).
- Из-за своей природы обход бинарных деревьев обычно рекурсивен;
Это потому, что линейный обход (через цикл) не является естественным, когда есть два пути цикла.- Рекурсивный: это означает функцию, которая вызывает себя.
- В старомодных языках управление памятью требует ручного управления памятью.
- Руководство: означает, что вы должны сделать это самостоятельно.
- Когда вы выполняете ручное управление памятью, вам нужно попросить базовую систему освободить каждого члена дерева.
- Свободно: восстановить память в глобальных poos, чтобы ее можно было использовать повторно, и вам не хватит памяти.
- Освобождение: это делается путем вызова функции
free()
и передачи ей указателя, который вы хотите восстановить. - Указатель: это как виртуальная палка. В конце это память. Когда вы запрашиваете память, вам дается указатель (виртуальная флешка), который имеет память. Когда вы закончите, вы вернете указатель (виртуальная флешка).
Рекурсивное решение:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
Проблема в том, что рекурсия означает, что вы неоднократно вызываете одну и ту же функцию. Это увеличивает стек. Растущий стек использует больше памяти. Причина, по которой вы освобождаете дерево, заключается в том, что вы хотите вернуть память, используя больше памяти, контрпродуктивно (даже если вы вернете оба бита памяти назад).
Напоследок вопрос:
Так что проблема заключается в преобразовании приведенной выше рекурсивной версии в линейное решение (чтобы вам не приходилось использовать память).
Дайте тип узла
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
Напишите функцию, чтобы освободить дерево этих узлов.
Ограничения:
- Не может использовать рекурсию (даже косвенно)
Невозможно выделить динамическое пространство для отслеживания.
Обратите внимание, что есть решение O (n)
Победитель:
- Лучшая сложность.
- Tie Break 1: Первая отправка
- Tie Break 2: Наименьшее количество персонажей.