visualisierung von baumalgorithmen



  • hey!
    ich hab ein problem, hoffe ihr könnt mir helfen.
    ich muss für ein schülerprojekt das balancieren von binärbäumen darstellen (bestehend aus zahlen). der algorithmus an sich funktioniert wunderbar, jedoch will die visualisierung nicht wirklich. die einzelnen elemente werden über ein edit feld eingefügt/gelöscht. der baum wird dargestellt mittels einem image und gezeichnet mit canvas. schön und gut, jedoch hab ich jetzt keine ahnung, wie ich das mit der visualisierung hinbekommen soll... hab schon den primitiven ansatz gewählt, dass ich einfach nur die einzelnen baumzustände ausgebe, funktioniert jedoch nicht. habs probiert mit timer und der Sleep funktion, wobei das mit der sleep funktion recht gut hätte funktionieren können, die zeit (dementsprechend die anzahl der schritte in sek) haut hin, jedoch werden die einzelnen zustände nie ausgegeben, obwohl ich nach jedem sleep die ausgabe funktion geschrieben habe...
    hoffe ihr könnt mir helfen bzgl meines ansatzes, wenn dieser nicht funktioniert dann bitte andere vorschläge 🙂
    danke im vorraus!



  • Ein bissel Code von dem was Du versucht hast würde helfen den Fehler suchen zu können.



  • ok, hier:
    die ausgabefunktion(en):

    void out1 ( tnode *where, int x, int y, TImage * Image1, int h)                 //AUSGABE
    {
    
       if (where!=NULL)
      {
    
       Image1->Canvas->TextOut(x,y,where->cont);
       /*if (kennung=='l')
    	 { gotoxy(x+1,y-1);cout<<"/"<<endl; }
    	 else
    	 if (kennung=='r')
    	 { gotoxy(x-1,y-1);cout<<"\\"; }*/
       out1(where->lnf,x-100/(h),y+50, Image1, h+1);
       out1(where->rnf,x+100/(h),y+50, Image1, h+1);
      }
    
    }
    
    void out(tnode *where, int x, int y, TImage * Image1, int h)
    {
       Image1->Picture->Bitmap=NULL;
       Image1->Canvas->Pixels[0][0]=clWhite;
       out1(where, x,y,Image1, h);
    }
    

    eine drehungsfunktion (von 4 verschiedene) mit diversen versuche:

    void llr1 (tnode *&where, TTimer * Timer1, TImage * Image1)
    {
    
     Timer1->Enabled=1;
     if(zaehler==100)
     {
     tnode *hilf=where;
     where=hilf->lnf;
     hilf->lnf=where->rnf;
     where->rnf=hilf;
     Timer1->Enabled=0;
     zaehler=0;
     out(wurz, 250, 10, Image1, 1);
     //Sleep(1000);
     //wait(5);
     //cout<<"Rechtsrotation\n";
     }
     else {llr1(where, Timer1, Image1);zaehler++;}
    
    }
    

    die balance funktion:

    void balance1 (tnode *&where, TTimer * Timer1, TImage * Image1)                                    //BALANCIEREN
    {
     int hl , hr;
     if (where!=NULL)
     do
     {
      balance1 (where->lnf, Timer1, Image1);
      balance1 (where->rnf, Timer1, Image1);
      hl= hoehe (where->lnf);
      hr= hoehe (where->rnf);
      if (abs(hr-hl)>1)
       if (hl>hr)
    	if (hoehe(where->lnf->lnf)>=hoehe(where->lnf->rnf))
    	 llr1(where, Timer1, Image1);
    	else
    	 lrr1(where, Timer1, Image1);
       else
    	if (hoehe (where->rnf->rnf)>=hoehe(where->rnf->lnf))
    	 rrr1(where, Timer1, Image1);
    	else
    	 rlr1(where, Timer1, Image1);
    
     } while (abs(hr-hl)>1) ;
    }
    


  • hat keiner eine idee?
    ich bin noch nich so bewandert mit dem builder, vielleicht gibt es ja auch andere darstellungsformen, wie ich so ein baum darstellen kann?
    für die innere darstellung hab ich einfach

    struct tnode
    {
     int cont;
     tnode *lnf,*rnf;        
    };
    

    verwendet und die ganzen funktionen darauf aufgebaut, vielleicht könnt ihr mir ja jetz mehr sagen... 😞


Anmelden zum Antworten