Bevor Sie also einige grundlegende Informatikkonzepte lesen.
- Ein Binärbaum ist eine dynamisch zugewiesene Struktur (normalerweise für die geordnete Speicherung verwendet).
- Wegen seiner Natur ist das Durchqueren von Binärbäumen normalerweise rekursiv;
Dies liegt daran, dass lineares Überqueren (über eine Schleife) nicht natürlich ist, wenn es zwei Möglichkeiten zum Schleifen gibt.- Rekursiv: Dies ist eine Funktion, die sich selbst aufruft.
- In altmodischen Sprachen erfordert die Speicherverwaltung eine manuelle Speicherverwaltung.
- Handbuch: Bedeutet, dass Sie es selbst tun müssen.
- Wenn Sie die manuelle Speicherverwaltung durchführen, müssen Sie das zugrunde liegende System auffordern, jedes Mitglied des Baums freizugeben.
- Kostenlos: Stellen Sie den Speicher in den globalen Poos wieder her, damit er wiederverwendet werden kann und Ihnen nicht der Speicher ausgeht.
- Freigeben: Dies erfolgt durch Aufrufen der Funktion
free()
und Übergeben des Zeigers, den Sie wiederherstellen möchten. - Zeiger: Es ist wie ein virtueller Stock. Am Ende steht die Erinnerung. Wenn Sie nach Speicher fragen, erhalten Sie einen Zeiger (virtuellen Stick) mit Speicher. Wenn Sie fertig sind, geben Sie den Zeiger (virtuellen Stick) zurück.
Die rekursive Lösung:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
Das Problem ist dann, dass Rekursion bedeutet, dass Sie wiederholt dieselbe Funktion aufrufen. Dies vergrößert den Stapel. Wenn Sie den Stapel vergrößern, wird mehr Speicher benötigt. Der Grund, warum Sie den Baum freigeben, besteht darin, dass Sie möchten, dass mehr Speicher verwendet wird, was kontraproduktiv ist (auch wenn Sie beide Speicherbits zurückerhalten).
Endlich die Frage:
Das Problem dreht sich darum, obige rekursive Version in eine lineare Lösung umzuwandeln (damit Sie keinen Speicher verwenden müssen).
Geben Sie den Knotentyp an
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
Schreiben Sie eine Funktion, um einen Baum dieser Knoten freizugeben.
Beschränkungen:
- Kann keine Rekursion verwenden (auch nicht indirekt)
Es kann kein dynamischer Speicherplatz für die Verfolgung zugewiesen werden.
Beachten Sie, dass es eine O (n) -Lösung gibt
Gewinner:
- Beste Komplexität.
- Tie Break 1: Zuerst eingereicht
- Tie Break 2: Wenig Charaktere.