Деструктор для дерева с несколькими листьями

Приветсствую, мне необходимо пройти через все узлы в деструкторе и удалить потомков для каждого и так до рута, но не могу написать правильный алгоритм такого прохода. В каком то месте у меня всегда возникает бесконечный цикл. Мне нужно обойтись без рекурсии.

введите сюда описание изображения

Структура узла

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

Идея состоит в том, чтобы вместо неявного использования стека, как это было бы в рекурсии, использовать его явным образом.

корень кладем в стек

цикл, если стек не пуст
   взять верхушку стека (из стека не удалять)
   если нет потомков 
       удалить верхушку из стека
       удалить вершину из памяти
    иначе
        положить всех потомков в стек и отсоединить их от вершины      
конец цикла
→ Ссылка