2016-04-02 2 views
0

Ich versuche, einen Baum zu durchlaufen und seinen Inhalt in Präfix, Postfix und Infix Notation auszudrucken. Im Moment druckt das Programm nur einen Operator des eingegebenen Ausdrucks aus.Tree Traversal mit mehreren Parametern

Ich habe Methoden gesehen, diese rekursiv zu vervollständigen, aber sie haben alle einen Parameter in ihrer Funktion verwendet, der direkt mit der Klasse des Knotens zusammenhing. (Example)

Wie würde ich gehen, den linken und rechten Knoten des Baums rekursiv mit mehreren Parametern zu durchlaufen? Oder ist das überhaupt eine praktikable Option? Der Code, der mir Probleme gibt, sind Zeilen 32-42 in "expressiontree.cpp", aber ich habe die Header-Datei und ein Beispiel dafür, was der Code für den Kontext ausgibt, enthalten.

CODE (Der Link führt zu GitHub, weil die native Texteditor wird mir einige Probleme geben.)

Vielen Dank für alle Ideen, die Sie Jungs haben!

Antwort

0

Dies kann rekursiv mit mehr als einem Parameter durchgeführt werden, aber Sie werden jedes Mal in einem Zeiger auf eine „ETreeNode“ Instanz übergeben müssen, etwa so:

bool ETreeNode::preorder(ETreeNode* currentNode, char* s, int& n, const int& len){ 
    bool error = false; 

    if (!currentNode) // insure that the "currentNode" is not NULL 
     return true; // you can change this to implement your "error" variable if you want to 

    //YOUR CODE GOES HERE 
    if (m_bIsOperator) 
    { //operator node 
     s[n++] = m_chOp; //append operator character to s 

     preorder(currentNode->m_pLeftChild, s, n, len); // move to the next left node 
     preorder(currentNode->m_pRightChild, s, n, len); // move to the next right node 

     s[n++] = '\0'; //zero terminator 
    } //if 
    else 
    { //number node 
     char buffer[32]; //temporary character buffer 
     sprintf(buffer, "%d", m_nValue); //print number into buffer 
     strcat((char*)(s + n), buffer); //append buffer to s 
    } //else 

    return error; 
} //preorder 

Frage: Sind Ihre Daten Baum ist in Infix-Reihenfolge?

Sie wollen Code implementieren, um sicherzustellen, dass "n" niemals gleich oder größer als "len" wird.

Sie möchten auch eine Möglichkeit implementieren, um zu verhindern, dass Ihr Programm nach jeder Iteration einen Null-Terminator schreibt.

+0

Danke für die Rückmeldung! Ich werde das versuchen und sehen, wie es funktioniert. – HammerQueen

+0

Die Verwendung Ihrer Methode führte zu Compilerfehlern, da die Funktion in einer anderen verwandten Datei verwendet wird. Gemäß den Anweisungen kann ich nichts anderes als die Dateien ändern, die ich hier dokumentiert habe. Ich sehe, wie Ihre Methode funktionieren würde, aber ich denke nicht, dass es in meinen spezifischen Umständen lebensfähig ist. Gibt es eine Methode, bei der die Funktion nur noch 3 Parameter benötigt? – HammerQueen

+0

Normalerweise gibt es bei Datenstrukturen wie diesen eine Klasse, die die Datenstruktur selbst darstellt und verwaltet, und dann gibt es mindestens eine andere Unterklasse, die Elemente dieser Datenstruktur darstellt. Ist das bei dir der Fall? Haben Sie zum Beispiel eine Klasse namens "ETree" oder so ähnlich? Sie sagten, dass Sie die Klasse "ETreeNode" aufgrund der "Anweisungen", die Sie haben, nicht ändern können; bedeutet das, dass dies ein Schulprojekt oder etwas ähnliches ist? Können Sie neue Klassen hinzufügen oder nicht? Letzte Frage, wenn es eine Elternklasse gibt, kannst du das ändern? – Fearnbuster