Wie liefert diese Rekursionsfunktion in BST eine verkettete Liste, die in der richtigen Reihenfolge ist?Wie liefert diese Rekursionsfunktion in BST eine verkettete Liste, die in der richtigen Reihenfolge ist?
Gegeben: (Struktur)
typedef struct TreeNode
{
struct TreeNode *left ; //left child
struct TreeNode *right ; //right child
struct TreeNode *next ; //field for linked list in tree
Data Node_info; //info data in node
} TreeNode;
Nehmen wir an, wir ein BST mit den Nummern 3,2,4 haben. (3 ist root, 2 ist links Kind, 4 ist richtig Kind)
Ich habe 2 Funktionen, die das gleiche tun, sie erstellen eine verknüpfte Liste von der BST. Ich folge der Rekursion hier nicht weiter, wenn mir jemand helfen kann, es herauszufinden, wäre es großartig!
Erste Funktion:
void what1(TreeNode **head, TreeNode *root)
{
if(root == NULL)
return;
what1((head),root->right);
root->next=(*head);
(*head)=root;
what1((head),root->left);
}
Meine Berechnungen: Zum rechten Unterbaum, bis wir null zu erreichen, Rückkehr, 4-> nächsten Punkt auf NULL machen, Kopfpunkt auf 4 machen, dann gehen Sie nach links , zurück zu 4, zurück zu 1, jetzt 3-> nächster Punkt auf 4, und Kopfpunkt auf 4, und so weiter ..
Aber mir fehlt noch das Verständnis, wenn andere Funktionen "auf Halten" sind und wann werden sie ausgeführt, was bedeutet, dass meine Berechnungen nicht korrekt sind und ich die Funktion nicht richtig befolge, was bedeutet, dass ich irgendwo keine Rekursion unde habe Standing.
Hier ist die zweite Funktion, die ich absolut KEINE IDEE habe, wie man ihr folgt, was eigentlich das Gleiche macht. Wenn Sie mir mit einer dieser Funktionen helfen können, würde es sehr geschätzt werden, wenn ich versuche, Rekursion mit BST vollständig zu verstehen. Ich schreibe hier viele Fragen dazu, bis ich das vollständig verstehe.
TreeNode * what2(TreeNode *root)
{
TreeNode *left = NULL, *right = NULL, *tmp = root;
if (root != NULL)
{
left = what2(root->left);
right = what2(root->right);
root->next = right;
if (left != NULL)
{
tmp=left;
while (left->next != NULL)
left=left->next;
left->next=root;
}
}
return tmp;
}
bekomme ich das richtig; Wenn Sie what1 verwenden, starten Sie es mit "what1 (& root, root)", wobei "root" auf die Wurzel des Baums zeigt, richtig? – dercz
@dercz das linke Argument ist die Liste, die wir bauen werden und das richtige Argument ist die bst –
oh ja, man kann & root nicht als Kopf der Liste verwenden, da dann eine Schleife erstellt wird. Ich denke, Sie können Data einfach auf int setzen, einige Bäume konstruieren, die Scheitelpunkte mit positiven ganzen Zahlen beschriften und in jeder "*** -> next" -Zuweisung, z. mit "#define id_of (T) (T == NULL? 0: T-> Knoten_info)" und dann "links-> next = root; printf ("% d ->% d \ n ", id_von (links), id_of (Wurzel)); etc ... plus am Anfang jeder Prozedur fügen Sie Informationen zu einem Aufruf hinzu, zB "printf (" what1 (% d,% d) \ n ", id_of ((* head)), id_of (root));" - Das ist der einfachste Weg, um diese Funktionen zu untersuchen. – dercz