Baum in Console ausgeben



  • Hey,

    ich muss in einer Aufgabenstellung u.A. einen Baum grafisch auf der Console ausgeben.

    In meinen Beispielschnispeln taucht dieses hier auf:

    void printR(Node* p, int level)
    {
      if(p != 0)
      {
        for(int i=0; i < level, i++) cout << " ";
        cout << p->value << endl;
        for(Node* q = p->left; q != 0; q=q->right)
          printR(q,level+1);
      }
    }
    

    Hierdurch sollte eigentlich gemäß eines Unix Filesystemes beginnend bei der Wurzel alle Elemente ausgegeben werden. Hier fehlt mir aber die linke Seite des Teilbaumes.

    Sieht hier Jemand den Fehler?

    Wenn ich ein normale PreOrder mache dagegen:

    void printR(Node* p, int level)
    {
      if(p != 0)
      {
        for(int i=0; i < level; i++) cout << " ";
          cout << p->value << endl;
        printR(p->left,level+1);
        printR(p->right,level+1);
      }
    }
    

    erhalte ich meinen kompletten Baum.
    Das erste Schnipsel sollte aber auch funktionieren, evtl. hab ich mich hierbei verschrieben?

    Bitte um Hilfe



  • So sollte das auf der Console aussehen:
    http://img3.imagebanana.com/view/aj65hy0l/aktuell_cpp.JPG

    So sieht es jetzt aus:
    http://img3.imagebanana.com/view/z3c2quw/aktuell2_cpp.JPG

    Und das ist der Code im Moment:

    void printR(Node*& p, int level)
    {
      if(p != 0)
    	  {
    		for(int i=0; i < level-1; i++) 
    			cout << "   ";
    		if(level != 0)
    			cout << "|--";
    		cout << p->value << endl;
    		if(p->left != 0)
    		{
    			printR(p->left,level+1);
    		}
    		if(p->right != 0)
    		{
    			printR(p->right,level+1);
    		}
    	  }
    }
    

    Wie komme ich zum # ?



  • So etwa? (ungetestet)

    void printR(Node*& p, int level)
    {
    
            for(int i=0; i < level-1; i++)
                cout << "   ";
            if(level != 0)
                cout << "|--";
            if(p)
                    cout << p->value << endl;
            else
                    cout << '#' << endl;
            if(p->left != 0)
            {
                printR(p->left,level+1);
            }
            if(p->right != 0)
            {
                printR(p->right,level+1);
            }
    }
    

    Gruß,
    CSpille



  • CSpille schrieb:

    So etwa? (ungetestet)

    Habs getestet und das ändert an meiner vorherigen Ausgabe rein gar nichts...

    Mal noch ne andere Frage:
    Eine levelOrder wird ja mit Hilfe einer Warteschlange realisiert...

    Jetzt hab ich in meinen Unterlagen
    Queue<Node*>queue;

    stehen mit den Methoden:
    queue.front(p);
    queue.remove()
    queue.push(p);
    queue.insert(p->left);
    queue.insert(p->right);

    weiss Jemand welche lib das sein soll?
    In den Unterlagen die ich bekommen habe steht hierzu nichts mehr

    aber die queue aus der STL ist es jedenfalls nicht, gibt überschneidungen aber insert/remove/empty sind gänzlich unbekannt....*omg*


Anmelden zum Antworten