Rekursiv Tiefe eines binären Suchbaums ermitteln

Trümmermacher

Bekanntes Mitglied
Hier wir sollen diese AUfgabe lösen .Weiter unten ist mein Lösungsansatz ich wüsste leider nur die Möglichkeit es zu lösen. Wenn ich die Methoden getleftNode und getRightNode hinzufüge.

Leider weiss ich nicht ob es erlaubt ist gibt es einen anderen Weg??
Ich glaube es ist auch gewollt das die Aufgabe rekursiv gelöst wird !

Bitte um Hilfe

Java:
public class BinaryTree {
private TreeNode root = null;
private static class TreeNode { public int value; public TreeNode left, right; }

public int getNumberOfLeaves() {
// TODO
return 0;

}
private int getNumberOfLeaves(TreeNode tree) {
// TODO
return 0; }

}


Java:
public int getNumLeafNodes(){
        int c=0;
     
        if(getLeftNode()!=null)
            c+=getLeftNode().getNumLeafNodes();
        if(getRightNode()!=null)
            c+=getRightNode().getNumLeafNodes();
        else
            return 1;
     
     
        return c;
    }
 
Zuletzt bearbeitet von einem Moderator:

flopalko

Bekanntes Mitglied
Die TreeNodes sind public und somit brauchst du keine getter. Du greifst direkt auf den Wert zu.
Also bei deinem Code statt dem getLeft/RightNode einfach direkt drauf zugreifen.
In welcher Klasse hast du überhaupt vor diese Methode zu implementieren? Im Tree oder in TreeNode?
 

Andi_CH

Top Contributor
Einfach mal ein weiterer Hinweis:

Java:
public int getNumLeafNodes(){
        int c=0;
   
        if(getLeftNode()!=null)
// Annahme: ist nicht null -> c bekommt also einen Wert
            c+=getLeftNode().getNumLeafNodes();

        if(getRightNode()!=null)
// Annahme das ist null
            c+=getRightNode().getNumLeafNodes();
        else
//Das wird ausgeführt und somit der Wert von c vergessen
            return 1;
        return c;
    }
 

Trümmermacher

Bekanntes Mitglied
Ich hab ne Nacht drüber geschlafen :D

Aber wie kann ich denn left und right zugreifen ich bekomme immer eine Fehlermeldung irgendwas mache ich falsch

Ich muss doch eigentlich den baum jede node abklppern und gucken ob sie eine left oder right Node haben und wenn nicht wird beim zähler +1 gezählt , oder irre ich mich da???
 

Trümmermacher

Bekanntes Mitglied
@Andi_CH ich rechne die Werte doch bei c dazu ich verwende += und damit wird es nicht überschrieben sondern dazu gerechnet nur unten habe ich den Fehler mit else return 1 return c das müsste anders rum sein .
 

Meniskusschaden

Top Contributor
Wie lautet denn überhaupt die Aufgabenstellung? Soll nun die Baumtiefe ermittelt werden oder die Anzahl der Blätter oder die Anzahl aller Knoten? Habe den Eindruck, dass der bisherige Code nur wenig mit dem Thread-Titel zu tun hat.
 

Meniskusschaden

Top Contributor
Ich muss doch eigentlich den baum jede node abklppern und gucken ob sie eine left oder right Node haben und wenn nicht wird beim zähler +1 gezählt , oder irre ich mich da???
Wenn es keinen Nachfolger gibt, muß 1 zurück geliefert werden. Du lieferst aber auch 1 zurück, falls es nur einen Nachfolger gibt und verwirfst die Blätter-Anzahl aus dem Zweig des Nachfolgers. Siehe Hinweis von @Andi_CH.
 

Trümmermacher

Bekanntes Mitglied
Könnte ich es nicht ungefähr so lösen??? weil ich muss ja beide methoden benutzen sonst wären sie nicht aufgeführt

Java:
public class TreeNode2 {
private TreeNode root = null;
private static class TreeNode {
public int value;
public TreeNode left, right;
}
     public int getNumLeafNodes() {
    if (root.left == null && root.right == null) {
      
    return 1;// er zeigt mir einen fehler an wenn ich 1 zurückgeben will
    }
     }


private int getNumberOfLeaves(TreeNode tree) {
        int leafNb = 0;
         for (Treenode tree : root) {// die zeile ist noch nichr richtig kann mir da jemand helfen ???
             int childLeafs = tree.getNumLeafNodes();
             leafNb = childLeafs;
         }
         return leafNb;
}
}
 

Kababär

Top Contributor
Hast du einen Konstruktor oder kommt der Tree einfach bei "getNumberOfLeaves" mit?
Einfach mal ein weiterer Hinweis:

Java:
public int getNumLeafNodes(){
        int c=0;
  
        if(getLeftNode()!=null)
// Annahme: ist nicht null -> c bekommt also einen Wert
            c+=getLeftNode().getNumLeafNodes();

        if(getRightNode()!=null)
// Annahme das ist null
            c+=getRightNode().getNumLeafNodes();
        else
//Das wird ausgeführt und somit der Wert von c vergessen
            return 1;
        return c;
    }

Dabei zählst du aber nicht alle Blätter, sondern Knoten auf dem Weg. Dabei hast du auch das Problem, dass int kein null besitzt.
Dabei hast du noch einen Logikfehler. Angenommen, der linke Knoten ist nicht 0, sondern 1, aber dafür gibt es keinen rechten Knoten, dann returnst du trotzdem 1, läufst aber den linken Knoten trotzdem ab.
Lösung: einfach den else-Zweig entfernen mit Inhalt.
Aber wieso arbeitest du denn eigentlich so, wenn er doch das Objekt TreeNode hat?
Wozu eine getRight und getLeft Methode? Mann direkt auf left und right zugreifen.
Wieso geht ihr nicht einfach hin und schickt den TreeNode mit als Parameter?
Um auf Blätter zu prüfen, müsstest du demnach noch folgendes übernehmen (rekursiv):

Java:
  private int getNumberOfLeaves(TreeNode tree) {
  if (tree == null) {
  return 0;
  }
  if (tree.left == null && tree.right == null) {
  return 1;
  } else {
  return getNumberOfLeaves(tree.left) + getNumberOfLeaves(tree.right);
  }
  }

TE: Ich kann mir nicht vorstellen, dass ihr den Code so bekommen habt. Hast du das alles selbst geschrieben? Hoffe ich konnte etwas helfen :D
 

Kababär

Top Contributor
Könnte ich es nicht ungefähr so lösen??? weil ich muss ja beide methoden benutzen sonst wären sie nicht aufgeführt

Java:
public class TreeNode2 {
private TreeNode root = null;
private static class TreeNode {
public int value;
public TreeNode left, right;
}
     public int getNumLeafNodes() {
    if (root.left == null && root.right == null) {
     
    return 1;// er zeigt mir einen fehler an wenn ich 1 zurückgeben will
    }
     }


private int getNumberOfLeaves(TreeNode tree) {
        int leafNb = 0;
         for (Treenode tree : root) {// die zeile ist noch nichr richtig kann mir da jemand helfen ???
             int childLeafs = tree.getNumLeafNodes();
             leafNb = childLeafs;
         }
         return leafNb;
}
}

Falls ein "root" einen Nachfolger hat, der u.U. auch mehrere Blätter hat, gibst du trotzdem nur 1 zurück.
Und: dachte es soll rekursiv sein?
 

Trümmermacher

Bekanntes Mitglied
@Kababär das ist der Code den wirbekommen haben mit der Aufgabenstellung die Blattknoten zu zählen
Java:
public class TreeNode2 {
private TreeNode root = null;
private static class TreeNode {
public int value;
public TreeNode left, right;
}
     public int getNumLeafNodes() {
    
       
    return 0;
    
     }


private int getNumberOfLeaves(TreeNode tree) {
        return 0
         }
         

}
[/JAVA]
 

Trümmermacher

Bekanntes Mitglied
@Kababär so wie hier bei dieser Methode aus einer anderen Aufgabe
Java:
    public int getNumLeafNodes() {
           if (children == null || children.length == 0) {
               return 1;
           }

           int leafs = 0;
           for (Treenode child: children) {
               leafs += child.getNumLeafNodes();
           }
           
           return leafs;
       }
[/JAVA]
 

Kababär

Top Contributor
Ok, eine rekusrive Methode ist eine Methode, die sich selbst aufruft bis zu eine gewisse Bedingung erfüllt ist.
Das was du machst ist: Rufe bis eine gewisse Bedingung erfüllt ist, eine Methode auf.
Das ist was anderes. Brauchst du es denn rekursiv?
 

Trümmermacher

Bekanntes Mitglied
ne nicht unbedingt anscheinend thema echt falsch gewählt !!!:D
Mir ist klar das eine Methode die sich immer wieder selbst aufruft nur rekursiv ist . In diesem Fall hab ich das Wort falsch benutzt :D

Die Aufgabe soll mit den zwei angegeben Methoden erledigt werden!!!!
 

flopalko

Bekanntes Mitglied
Poste doch mal die Aufgabenstellung. Ich glaube nämlich, dass du selbst schon den Überblick verloren hast was gegeben und was verlangt ist.
Im ersten Post meinst du es ist rekursiv zu lösen, dafür fehlt aber die Methode getNumLeafNodes in der Klasse TreeNode. Du hast diese nur im BinaryTree und somit kannst du es gar nicht rekursiv lösen.
Solltest du nur die Angabe falsch übertragen haben hier der Code aus deinem ersten Post angepasst damit es funktioniert:
Java:
public int getNumLeafNodes(){
        int c=0;
      
        if (left == null && right == null)
            return 1;
      
        if (left != null)
            c += left.getNumLeafNodes();
        if (right != null)
            c += right.getNumLeafNodes();   
    
        return c;
    }
Dieser Code gehört in die Klasse TreeNode. Folgend der Code für die Klasse BinaryTree zum Starten der Rekursion.
Java:
public int getNumberOfLeaves(){
    if (root != null)
        return root.getNumLeafNodes();
    return 0;
}
Aber poste wie gesagt die Aufgabenstellung denn nachdem du dir mit fast jedem Post selbst bezüglich der Aufgabenstellung widersprichst ist das hier nur geraten^^

EDIT: und aja @all: warum verwenden jetzt alle die getLeftNode und getRightNode Methoden? Er hat ja zu Beginn erwähnt, dass er nicht weiß, ob er diese verwenden darf, da nicht gegeben. Sie sind ja aber auch nicht nötig, da die TreeNodes left und right public sind, also warum nicht einfach direkt drauf zugreifen?
 

Trümmermacher

Bekanntes Mitglied
Hier nochmal der Code der uns zur Verfügung gestellt wurde und die Aufgabe war:

In dieser Aufgabe soll eine Methode implementiert werden,
die die Knotenblätter zählt und zurück gibt

Java:
public class TreeNode2 {
private TreeNode root = null;
private static class TreeNode {
public int value;
public TreeNode left, right;
}
     public int getNumLeafNodes() {
//TODO
return 0
     }


private int getNumberOfLeaves(TreeNode tree) {
  //TODO
return 0;
}
<0
[/JAVA]
 

Trümmermacher

Bekanntes Mitglied
Das war die vorherige Aufgabe in der das Minimum im Baum gesucht wurde
Java:
public class BinaryTree {
private TreeNode root = null;
private static class TreeNode {
public int value;
public TreeNode left, right;
}
public int findMinValue () {
// TODO
return 0;
}
private int findMinValue (TreeNode tree) {
// TODO
return 0;
}
}
[/JAVA]
Die Aufgabe habe ich so gelöst und ich denke die Anzahl der Blattknoten zählen müsste so ähnlich funktionieren 

[code=JAVA]
public int getMin (){
    return getMin(root);
}
private int getMin (TreeNode tree){
    if(tree.left!=null)                // If theres left, go left
        return getMin(tree.left);
    else
    return tree.value;                // if theres no left, return the value
}

}
[/JAVA]
 

flopalko

Bekanntes Mitglied
Java:
public class TreeNode2 {
    private TreeNode root = null;
    private static class TreeNode {
        public int value;
        public TreeNode left, right;
    }
    
    public int getNumLeafNodes() {
        if (root != null)
            return getNumberOfLeaves(root);
        return 0;
     }

    private int getNumberOfLeaves(TreeNode tree) {
        int c=0;
      
        if (tree.left == null && tree.right == null)
            return 1;
      
        if (tree.left != null)
            c += getNumberOfLeaves(tree.left);
        if (tree.right != null)
            c += getNumberOfLeaves(tree.right);   
    
        return c;
    }
}
und für die Zukunft bitte: ordentliches Einrücken vom Code beachten, Aufgabenstellung klar formulieren, mehr Eigeninitiative zeigen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
T Rekursiv Vokale zählen Java Basics - Anfänger-Themen 19
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
S Stringlänge Rekursiv ermitteln Java Basics - Anfänger-Themen 2
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6
0 a hoch b rekursiv - wie stoppen? Java Basics - Anfänger-Themen 3
T Ordnerstrucktur rekursiv auslesen Java Basics - Anfänger-Themen 9
G Rekursiv die größte Zahl eines Arrays Java Basics - Anfänger-Themen 6
G Rekursiv Array Elemente quadrieren Java Basics - Anfänger-Themen 2
N Fibo Zahlen:iterativ,rekursiv Anzahl der Additionen zählen Java Basics - Anfänger-Themen 2
P Permutationen einer Tour rekursiv Java Basics - Anfänger-Themen 4
G Baumstruktur rekursiv durchlaufen Java Basics - Anfänger-Themen 2
B Kürzesten Weg zwischen mehreren Punkten finden (rekursiv) Java Basics - Anfänger-Themen 5
L Kombinationen einer Menge rekursiv berechnen Java Basics - Anfänger-Themen 11
J BinBaum rekursiv ausgeben Java Basics - Anfänger-Themen 9
W Rekursiv Zeichen einfügen Java Basics - Anfänger-Themen 6
M Verzeichnisse rekursiv durchlaufen und dann RegEx Java Basics - Anfänger-Themen 6
G Array rekursiv teilen und aufsummieren Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben