tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
2444
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    hallo allerseits,
    ich hab folgendes problem. ich soll eine methode schreiben die rekursiv aufgerufen wird um die anzhal der knoten in einem binärbaum zu zählen. hier ist mal mein vorschlag, leider klappts nicht so wie ich will. danke schon mal im vorraus


    // Gibt die Anzahl der Knoten im Baum zurück.
    // node ist die Wurzel des aktuellen (Teil)baums.
    public static int countNodes(BinaryNode node)
    {
    int z1 = 0;
    int z2 = 0;
    int zaehler = 0;
    if(node.getLeft()!=null)
    {
    countNodes(node.getLeft());
    z1++;

    }
    if (node.getRight()!=null)
    {
    countNodes(node.getRight());
    z2++;
    }
    zaehler = z1 + z2;
    return zaehler;
    }
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    868
    Code bitte unbedingt in die dafür vorgesehenen Tags (siehe meine Signatur).

    kleiner Tipp: dein Code ist zwar rekursiv, allerdings verwendest du die Ergebnisse der weiteren Methodenaufrufe nicht! Stattdessen wird nur die oberste Ebene des Binärbaumes gezählt.

    So wäre es richtig:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public static int countNodes(BinaryNode node){
     int zaehler = 0;
     if(node.getLeft()!=null)
     {
         zaehler += countNodes(node.getLeft());
         zaehler++;
     }
     if (node.getRight()!=null)
     {
         zaehler += countNodes(node.getRight());
         zaehler++;
     }
     zaehler = z1 + z2;
     return zaehler;
     }

    Besser wäre allerdings, du würdest keine Rekursion verwenden, das führt zu unnötiger Speicherbelastung!
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    danke ich werds mal testen.

    die rekursion muss ich leider machen da das in der aufgabe so vorgegeben ist
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    schau mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    package de.tutorials;
     
    public class BinTreeExample {
     
      public static void main(String[] args) {
        
        Node left3 = new Node();
        
        Node right2 = new Node();
        Node left2 = new Node(left3,null);
        
        Node right1 = new Node(left2,right2);
        Node left1 = new Node();
        
        Node left0 = new Node(left1,right1);
        Node right0 = new Node();
        
        Node root = new Node(left0, right0);
        
        System.out.println(countNodes(root));
      }
      
      
      private static int countNodes(Node node) {
        return node == null ? 0 : 1 + countNodes(node.left) + countNodes(node.right);
      }
      
     
      static class Node{
        Node left;
        Node right;
        
        public Node(){}
        
        public Node(Node left, Node right) {
          this.left = left;
          this.right = right;
        }
      }
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    vielen dank für die schnelle hilfe, hat super geklappt
     

  6. #6
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    das würde mich aber auch zu noch einer anderen frage bringen. wie kann man nun prüfen ob ein binärbaum vollständig ist? hier mein vorschlag.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public static boolean isComplete(BinaryNode node)
        {
            if ( node != null)
            {
                return true;
            } else 
            {
                return isComplete(node.getLeft()) && isComplete(node.getRight());
            }
        }


    allerdings gibt diese methode immer nur true zurück weil ich nicht genau weiss wie ich den false-teil einbauen muss
     

  7. #7
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    500
    Ein unvollständiger Binärbaum ist doch, wenn ein Knoten genau einen Kindknoten hat, oder? Ich hatte soetwas leider nie gelernt Er wäre vollständig, wenn beide Knoten null oder beide Knoten nicht null sind, der Rückgabewert wäre demzufolge gleich.
    Geändert von HonniCilest (04.05.11 um 13:08 Uhr)
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  8. #8
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    schau mal hier: (gemäß der Definition von oben)
    Code java:
    1
    2
    3
    
      private static boolean isComplete(Node node) {
        return node != null && (isComplete(node.left) == isComplete(node.right));
      }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  9. #9
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    @ HonniCilest, also eine Definition die ich gefunden habe lautet: ein vollständiger Baum hat auf jedem Niveau die maximal mögliche Knotenzahl und sämtliche Blätter haben diesselbe Tiefe, so das zur info .

    @Thomas, vielen Dank für deinen Tip. Ich werde es später noch testen und morgen posten ob es funktioniert
     

  10. #10
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    500
    Zitat Zitat von starbug Beitrag anzeigen
    @ HonniCilest, also eine Definition die ich gefunden habe lautet: ein vollständiger Baum hat auf jedem Niveau die maximal mögliche Knotenzahl und sämtliche Blätter haben diesselbe Tiefe, so das zur info .
    Dann müsste man da vermutlich eher Mathematisch herangehen... Ich denke aber du benötigst die Maximale Tiefe deines Baumes, die musst du irgendwo herbekommen. Ansonsten hast du ja bereits die Anzahl der Knoten. Also müsste reintheoretisch eine Gleichung zu bilden sein *nachdenk*...

    Knotenanzahl = 2^Baumtiefe-1 <-- (oder so ähnlich)

    Dann kannst du die so errechnete Knotenanzahl mit der tatsächlichen Knotenanzahl vergleichen.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  11. #11
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    danke für alle tips hat alles gut geklappt
     

  12. #12
    Miaming Miaming ist offline Mitglied Bronze
    Registriert seit
    May 2011
    Beiträge
    40
    Hallo zusammen,

    um nicht nen neuen Thread aufzumachen möchte ich hier meine Frage reinstellen in der Hoffnung vll. den ein oder anderen Tipp zu bekommen, und zwar muss ich die Anzahl der Blätter zählen. Ich habe folgenden Code entwickelt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public static int countLeaves(BinaryNode node)
        {
               if (node == null)
                     return 0;  
                 
                    
                 else if (node.left == null && node.right == null)
                    return 1;
                  
                 else
                     return countLeaves(node.getLeft()) + countLeaves(node.getRight());
        }

    kann das so richtig sein?
     

  13. #13
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    joa das is ganz gut das habe ich auch so
     

  14. #14
    Miaming Miaming ist offline Mitglied Bronze
    Registriert seit
    May 2011
    Beiträge
    40
    klasse

    Du hast du schon den Aufgabenteil2 ? Irgendwie ansatumäßig was gescheihtes? du weißt worum es geht nehm ich an die Höhe des B-Baums etc. ... ich brauch unbedingt 2 Punkte für diese Aufgabe ...
     

Ähnliche Themen

  1. Wörter in einem Textfeld zählen
    Von spoooner im Forum Visual Basic 6.0
    Antworten: 8
    Letzter Beitrag: 16.04.06, 02:56
  2. Knoten-Attribute einer xsd-Datei in einem JTree auslesen
    Von Perplex im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 20.07.05, 18:24
  3. Bilder in einem Ordner zählen!
    Von maeg im Forum PHP
    Antworten: 5
    Letzter Beitrag: 24.05.05, 11:00
  4. Wie kann man Knoten einer XML-Datei zählen ?
    Von Goldman im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 22.03.04, 22:10
  5. Datein in einem Verzeichnis zählen
    Von Aeris im Forum PHP
    Antworten: 1
    Letzter Beitrag: 27.11.01, 16:58