Отже, перш ніж прочитати деякі основні поняття з інформатики.
- Бінарне дерево - це динамічно розподілена структура (зазвичай використовується для впорядкованого зберігання).
- Через свою природу обхід бінарних дерев зазвичай рекурсивний;
Це тому, що лінійне проходження (через цикл) не є природним, коли є два напрямки циклу.- Рекурсивний: це означає функцію, яка викликає себе.
- Старомодними мовами управління пам’яттю вимагає ручного управління пам’яттю.
- Посібник: означає, що ви повинні зробити це самостійно.
- Під час керування пам'яттю вручну потрібно фактично попросити базову систему звільнити кожного члена дерева.
- Безкоштовно: відновіть пам’ять у глобальний 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)
Переможець:
- Найкраща складність.
- Перерва у краватці 1: Перший поданий
- Tie Break 2: Найменша кількість символів.