[Java] Binärbäume durchlauf-methoden

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von allstar, 24. Januar 2011 .

Schlagworte:
  1. 24. Januar 2011
    Binärbäume durchlauf-methoden

    hey, also wie der Topic bereits sagt geht es um binärbäume. gegeben ist ein binärbaum mit int werten und ich soll eine methode coden die den baum durchläuft und am ende die anzahl der geraden werte in diesem baum ausgibt.
    ich durchlaufe den baum mit der infix-methode.

    mein code sieht so aus:

    PHP:
    public  int  anzahlGeraderWerte (){
              if(
    this . left != null ) {  left . anzahlGeraderWerte ();}
                if(
    wert % 2 == 0 ) counter ++;
              if(
    this . right != null ) {  right . anzahlGeraderWerte ();}
             return 
    counter ;
            }
            
    die sache ist, dass er ja von untersten knotenpunkt anfängt den die werte zu testen und wenn der wert 3 ist, dann gibt er mir automatisch 0 zurück weil er die anderen werte dann erst gar nicht testet.
    ich bin mir ziemlich sicher, dass ich den befehl return counter falsch plaziert habt.

    eine mögliche lösung sieht so aus:

    PHP:
       int knotenAnzahlgerade () { return 
                                 ( 
    left == null  left . knotenAnzahlgerade () )  
                                 +(
    wert % 2 == 1 : 0 )+
                                  ( 
    right == null  right . knotenAnzahlgerade () ) ; 
          
        }
            
    im prinzip ist es ja das selbe was ich habe, nur das return steht am anfang, ich weiss nicht wie ich ein in mein code einbauen kann.

    hier der konstruktor für den baum damit ihr wisst was die einzelnen variablen heissen.
    PHP:
    int counter = 0 ;
            
    int wert  ;
          
    Tree left right  ;
          
    Tree int i Tree l Tree r  ) {  wert = left = right = ; }
     
  2. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    also du solltest dir mal dringend nen indent style aussuchen und verwenden, denn so isses grausam deinen code zu lesen.

    Indent style - Wikipedia, the free encyclopedia

    ---

    zu deinem problem:

    Code:
    return counter + left.counter + right.counter;
    bzw. so:
    Code:
    public int anzahlGeraderWerte()
    {
     int lc = 0,
     rc = 0;
     
     if(this.left != null)
     lc = left.anzahlGeraderWerte();
     
     if(wert % 2 == 0)
     counter++;
     
     if(this.right != null) 
     rc = right.anzahlGeraderWerte();
     
     return counter + lc + rc;
    } 
     
  3. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    meinst du so?:

    PHP:
      public  int  anzahlGeraderWerte (){
              if(
    this . left != null ) {  left . anzahlGeraderWerte ();}
                if(
    wert % 2 == 0 ) counter ++;
              if(
    this . right != null ) {  right . anzahlGeraderWerte ();}
             return 
    counter  left . counter  right . counter ;
            }
    so tritt aber ein null-pointer auf.


    PS: an dem style versuche ich zu arbeiten, bin nämlich noch totaler anfänge
     
  4. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    Du lässt in deinem Code die Geraden Zahlen der Kidner zählen, erhöhst dabei aber nie den Counter, wodurch diese Werte verpuffen

    Code:
    public int anzahlGeraderWerte(){
     if(wert%2==0) {
     counter = 1; //sonst würde der zweite aufruf der Methode ziemlichen Müll produzieren
     }
     else {
     coutner = 0;
     }
     
     if(this.left!=null) { 
     counter += left.anzahlGeraderWerte();
     }
     
     if(this.right!=null) { 
     counter += right.anzahlGeraderWerte();
     }
     
     return counter;
    } 
    
    dürfte das problem lösen

    ansonsten solltest du dir echt einen schöneren code-stil aneignen^^ das ist echt ecklig zu lesen
     
  5. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    die counter-eigenschaft ist doch eh irgendwie unnütz, oder nicht?

    ich mein wenn man dem baum rekursiv durchläuft sind die werte die in den klassen gespeichert werden doch total unnötig.

    Code:
    public int anzahlGeraderWerte()
    {
     int lc = 0,
     rc = 0;
     
     if(this.left != null)
     lc = left.anzahlGeraderWerte();
     
     if(this.right != null) 
     rc = right.anzahlGeraderWerte();
     
     return lc + rc + ((wert % 2 == 0) ? 1 : 0);
    } 
     
  6. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    jap dürftest du recht haben. ne lokale variable dürfte das viel sinnvoller erledigen und vermeidet halt so fehler, die auftreten falls man die methode zweimal aufrufen würde
     
  7. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    jo danke euch beiden, hab mein code geändert und jetzt funzt er auch soweit ganz gut.

    PHP:
      public  int  anzahlGeraderWerte (){
              if(
    left != null ){
                     
    counter += left . anzahlGeraderWerte ();
                    }
              
              if(
    wert % 2 == 0 )
                    
    counter ++;
              
              if(
    right != null ){ 
                     
    counter += right . anzahlGeraderWerte ();
                    }
                    
                     return 
    counter ;
            }
    @Murdoc
    kannst du mir vielleicht deine methode genauer erklären? du hast zwar zwei variablen, aber die werden nicht erhöht wenn ich es richtig verstehe

    BWs sind raus


    mfg allstar
     
  8. 24. Januar 2011
    AW: Binärbäume durchlauf-methoden

    naja er berechnet zuerst die entsprechende anzahl an graden zahlen der beiden kinder und weist diese den variablen zu

    anschließend rechnet er diese zusammen und überprüft ob der aktuelle wert eine grade zahl ist, dann wird nochmal dieser wert hinzuaddiert und das ganze wird zurückgegeben

    die variablen brauchst du gar nicht zu erhöhen
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.