// Error a propósito: un destructor recursivo sobre una cadena larga se queda sin pila.
// Uso: recursive_destroy n
#include <cstdlib>
#include <iostream>

struct Node {
    int key;
    Node* left;
    Node* right;
};

void destroy(Node* node) {
    if (node == nullptr) {
        return;
    }
    destroy(node->left);
    destroy(node->right);
    delete node;
}

int main(int argc, char** argv) {
    long n = argc > 1 ? std::atol(argv[1]) : 1000000;
    // Se arma la cadena directo: con insert, un millón de claves ordenadas tardaría muchos minutos.
    Node* root = nullptr;
    Node* last = nullptr;
    for (long i = 0; i < n; i++) {
        Node* node = new Node{static_cast<int>(i), nullptr, nullptr};
        if (last == nullptr) {
            root = node;
        } else {
            last->right = node;
        }
        last = node;
    }
    destroy(root);
    std::cout << "destruido: " << n << " nodos" << std::endl;
    return 0;
}
