Quindi, prima di leggere alcuni concetti di base di informatica.
- Un albero binario è una struttura allocata in modo dinamico (solitamente utilizzata per l'archiviazione ordinata).
- A causa della sua natura, l'attraversamento di alberi binari è generalmente ricorsivo;
Questo perché l'attraversamento lineare (tramite un loop) non è naturale quando ci sono due strade di loop.- Ricorsivo: significa una funzione che si chiama da sola.
- Nelle vecchie lingue, la gestione della memoria richiede una gestione manuale della memoria.
- Manuale: significa che devi farlo da solo.
- Quando si esegue la gestione manuale della memoria, è necessario chiedere al sistema sottostante di liberare ciascun membro dell'albero.
- Gratuito: recupera la memoria nella poos globale in modo che possa essere riutilizzata e non esaurire la memoria.
- Liberazione: questo viene fatto chiamando la funzione
free()
e passandole il puntatore che si desidera ripristinare. - Puntatore: è come un bastone virtuale. Alla fine è la memoria. Quando chiedi memoria ti viene dato un puntatore (stick virtuale) che ha memoria. Al termine restituisci il puntatore (levetta virtuale).
La soluzione ricorsiva:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
Il problema quindi è che la ricorsione significa che stai ripetutamente chiamando la stessa funzione. Questo fa crescere lo stack. La crescita dello stack utilizza più memoria. Il motivo per cui stai liberando l'albero è che vuoi che la memoria venga ripristinata usando più memoria è controproducente (anche se ottieni entrambi i bit di memoria).
Alla fine la domanda:
Quindi il problema è incentrato sulla conversione della versione ricorsiva sopra in una soluzione lineare (in modo da non dover usare la memoria).
Indica il tipo di nodo
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
Scrivi una funzione per liberare un albero di questi nodi.
restrizioni:
- Impossibile utilizzare la ricorsione (nemmeno indirettamente)
Impossibile allocare spazio dinamico per il tracciamento.
Nota che esiste una soluzione O (n)
Vincitore:
- Migliore complessità.
- Tie Break 1: primo inviato
- Tie Break 2: Minima quantità di personaggi.