Деструктор для дерева с несколькими листьями
Приветсствую, мне необходимо пройти через все узлы в деструкторе и удалить потомков для каждого и так до рута, но не могу написать правильный алгоритм такого прохода. В каком то месте у меня всегда возникает бесконечный цикл. Мне нужно обойтись без рекурсии.
Структура узла
struct node {
node* children[128] = {};
node* parent = nullptr;
char payload = 0;
bool is_end = false;
};
Деструктор дерева
tree::~tree()
{
node *current_node = m_root;
bool flag = false;
bool flag2;
size_t tmp;
while(!flag) {
tmp = 0;
for (auto j: current_node->children) {
if (j != nullptr) tmp++;
}
if (tmp == 0) {
if (current_node->parent == nullptr) {
delete m_root;
flag = true;
} else {
current_node = current_node->parent;
}
} else {
//down
while (true) {
tmp = 0;
for (auto j : current_node->children) {
if (j != nullptr) {
current_node = j;
break;
}
tmp++;
}
if (tmp != 128) continue;
else break;
}
while (true) {
tmp = 0;
for (auto j : current_node->parent->children) {
if (j != nullptr) tmp++;
}
current_node = current_node->parent;
for (auto j : current_node->parent->children) {
delete j;
break;
}
if (tmp == 1) {
continue;
} else {
break;
}
}
}
}
}
Ответы (1 шт):
Автор решения: gbg
→ Ссылка
Идея состоит в том, чтобы вместо неявного использования стека, как это было бы в рекурсии, использовать его явным образом.
корень кладем в стек
цикл, если стек не пуст
взять верхушку стека (из стека не удалять)
если нет потомков
удалить верхушку из стека
удалить вершину из памяти
иначе
положить всех потомков в стек и отсоединить их от вершины
конец цикла
