Binärer Baum Tiefe

Status
Nicht offen für weitere Antworten.
M

MintMinit

Gast
Halli Hallo,

bin gerade dabei für einen binären Baum die Tiefe zu schreiben. Versucht hab ich es mit folgenden Methoden:

Code:
 public int depth(Node n){
		// Liefert die Tiefe des Knotens
		return depth(root, n.data);
	}

   
  
    private int depth(Node n, String elem){
        // Liefert die Anzahl der Kanten vom Konten n bis zu dem (eindeutigen) Element,
        // das "elem" als Wert (in der Variablen data) enthält.
        
        // Hinweis: ob ein Knoten das Element "elem" enthält, prüfen Sie mit der
        // String-Methode "equals"; also z.B. n.data.equals(elem)
        // die Prüfung auf "n.data == elem" führt nicht zum gewüschnten Ergebnis!
        int lDepth=0;
        int rDepth=0;
        if (n.isLeaf()) return 0;
        if(n.left!=null&&n.data.equals(elem))lDepth = depth(n.left,elem);	// Tiefe des li. Unterbaums berechnen
        if(n.right!=null&&n.data.equals(elem))rDepth = depth(n.right,elem);	// Tiefe des re. Unterbaums berechnen
        if (lDepth < rDepth) 		// Tiefe des tieferen Unterbaums
            return (1+lDepth);		// um 1 erhöht zurückliefern
        else
            return(1+rDepth);
         }

Wenn ich jetzt folgenden Baum aufbaue(dargestellt als ausschließlich Knoten):

Code:
                    M
            F                S
      D                P          X
A          E


Wenn ich jetzt nach dem Knoten F suche, dann hat er eine Tiefe von 1, was ja OK ist.
Wenn ich nach D suche, dann hat der auch nur eine Tiefe von 1.
Wenn ich nach A oder E suche, dann hat er auch nur ne Tiefe von 1.
Wenn ich nach M suche, dann gibt mir das Programm ne Tiefe von 2 aus.

Kann mir jemand sagen, was da falsch läuft?

Danke.[/img]
 

Leroy42

Top Contributor
Code:
private int depth(Node n, String elem) {
  if (n == null) return -1;
  if (n.data.equals(elem)) return 0;
  else 
     return 1 + depth(elem.compareTo(n.data) < 0 ? n.left : n.right);
}
 

Yzebär

Bekanntes Mitglied
Ich hätte erwartet, daß man anstelle
Code:
if(n.left!=null&&n.data.equals(elem))
sowas schreibt...
Code:
if(n.left!=null&&n.left.data.equals(elem))
außerdem solltest du das noch ergänzen
Code:
if (n.isLeaf() || n.data.equals(elem) ) return 0;
 

Leroy42

Top Contributor
Darüber zu spekulieren ist müßig,
solange wir die Datenstruktur nicht genau kennen.

@OP poste doch mal deine Node-Definition
 
M

MintMinit

Gast
Hier meine Node Klasse

Code:
public class Node {
    
    protected String data;
    protected Node left;
    protected Node right;
    
    public Node(String d) {
        super();
        data = d;
        left = null;
        right = null;
    }
    
    public String toString(){
        return data.toString();
    }

  public boolean isLeaf(){
        boolean a=false;
        if((left==null) && (right==null))a=true;
        return a;
    }
    
    public boolean hasLeftChildren(){
        boolean a=false;
        if(left!=null) a=true;
        return a;
//        return true;
    }
    
    public boolean hasRightChildren(){
      boolean a=false;
        if(right!=null) a=true;
        return a;
//        return true;
    }
    
   }
 

Leroy42

Top Contributor
Genau, wie ich es mir gedacht habe. :D

Dann müßte mein Code (ohne Yzebärs Änderungsvorschlägen)
eigentlich laufen. ???:L

Was ist denn falsch? (Wenn überhaupt etwas falsch ist)
 

Leroy42

Top Contributor
Du kannst die Klassendefinition übrigens auch straffen.

Code:
public class Node { 
    protected String data; 
    protected Node left; 
    protected Node right; 
    
    public Node(String d) {
      data = d;
    } 
    
    public String toString() {
      return data.toString();
    } 

    public boolean isLeaf() {
      return left==null && right==null;
    } 
    
    public boolean hasLeftChildren()  {return left  != null;} 
    public boolean hasRightChildren() {return right != null;}
   }
 
M

MintMinit

Gast
Bei deiner Methode von oben, da rennt er in folgende
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError!

Kann man die auch ohne compare schreiben?
return 1 + depth(elem.compareTo(n.data) < 0 ? n.left : n.right);

Das eigentliche Problem ist, dass dieses dämliche Programm mir bei der Wurzel die Tiefe 2 ausgibt
 
G

Gelöschtes Mitglied 5909

Gast
java.lang.StackOverflowError! deutet auf zu hohe rekursion hin.
desweiteren wäre ein template sinnvoll

Code:
public class Node<T> {
 private T data;
 private Node<T> left;
 private Node<T> right;

}
 

Leroy42

Top Contributor
Also ich habe meinen Code jetzt mal getestet und
es klappt alles so wie es sein soll; kann es sein, daß du
beim Einfügen irgendetwas anders machst? ???:L
 

Leroy42

Top Contributor
raiL hat gesagt.:
java.lang.StackOverflowError! deutet auf zu hohe rekursion hin.
...was nur passieren kann, wenn das gesuchte Element
nicht existiert und das Programm in eine Endlosschleife
gerät.

Genau das habe ich aber berücksichtigt, und liefere in diesem
Fall eine -1
 
G

Guest

Gast
Leroy42 hat gesagt.:
Code:
private int depth(Node n, String elem) {
  if (n == null) return -1;
  if (n.data.equals(elem)) return 0;
  else 
     return 1 + depth(elem.compareTo(n.data) < 0 ? n.left : n.right);
}

Ich kann mir nicht vorstellen, daß dieser Code funktioniert. Wie werden denn durch den Ausdruck "elem.compareTo(n.data) < 0 ? n.left : n.right" beide Zweige durchsucht?
 

Yzebär

Bekanntes Mitglied
Der letzte Eintrag war von mir...

Ich wollte noch anfügen, daß meine anfangs geposteten Änderungen Quatsch sind... :oops:
 

Leroy42

Top Contributor
Anonymous hat gesagt.:
Wie werden denn durch den Ausdruck "elem.compareTo(n.data) < 0 ? n.left : n.right" beide Zweige durchsucht?

Je nach Ergebnis des Vergleiches liefert der tertiäre Operator (? : )
entweder den Ausdruck n.left oder n.right. Mit diesem wird dann die
Methode depth rekursiv aufgerufen.

Aber du hast schon Recht: Die Anweisung muß natürlich heißen:

Code:
return 1 + depth(elem.compareTo(n.data) < 0 ? n.left : n.right, elem);

Etwas weitschweifiger formuliert, ist mein Code
identisch zu:

Code:
private int depth(Node n, String elem) { 
  if (n == null) return -1; 
  if (n.data.equals(elem)) return 0; 
  else {
    if (elem.compareTo(n.data) < 0) {
      return 1 + depth(n.left, elem);
    } else {
      return 1 + depth(n.right, elem);
    }
  }
}
 

Yzebär

Bekanntes Mitglied
Ich sehe immer noch ein Problem, nämlich wenn der Zweig, der durchsucht wird nicht den gesuchten Knoten beinhaltet, dann gibt doch dein Code ein 1 + .... -1 zurück. Oder sehe ich das falsch?

Nachdem mir selbst keine elegante Lösung einfällt, wie das Problem zu lösen ist, wenn man sich von Knoten zu Knoten hangelt, würde ich vorschlagen, jeweils in gesamten der Knotenebene zu suchen.

Etwa so...
Code:
public int sucheElement (ArrayList<Node> nodeList, int depth, String elemName)
{
    // Nur Liste bearbeiten, die Elemente enthält.
    if( nodeList == null || nodeList.size() == 0 )
        return -1;

    // Einen Iterator erzeugen, der durch die Liste der Knoten iteriert.
    Iterator listIterator = nodeList.iterator();
    // Eine neue Liste für die Knoten der nächsten Ebene erzeugen.
    ArrayList<Node> childNodes = new ArrayList<Node>();
    
    while( listIterator.hasNext() )
    {
         Node node = listIterator.next();

         // Element gefunden, depth zurückgeben.
         if( node.data.equals(elemName) )
             return depth;
         // Wenn vorhanden, Knoten eine Ebene tiefer der Liste hinzufügen.
         if( node.left != null )
             childNodes.add( node.left );
         if( node.right != null )
             childNodes.add(node.right);
     }

     // Ansonsten eine Ebene Tiefe weitersuchen.
     return sucheElement( childNodes, depth + 1, elemName );
}
Die Sache ist jetzt allerdings nicht mehr trivial, hätte aber den Vorteil, daß man auch in der Mitte des Baumes anfangen kann zu suchen (wenn man die Tiefe weiß) und einen Baum parallel anstatt sequentiell... ähh ja, ich höre schon auf... :bae:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
P Binärer Baum mit Composite-Entwurfsmuster Java Basics - Anfänger-Themen 2
G Binärer Baum Java Basics - Anfänger-Themen 3
T binärer Baum Java Basics - Anfänger-Themen 3
R binärer Baum Java Basics - Anfänger-Themen 2
Cassy3 Binärer Suchbaum Knoten rauslöschen Java Basics - Anfänger-Themen 1
G Java Binärer Suchbaum Java Basics - Anfänger-Themen 1
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1
L Binärer Suchbaum Java Basics - Anfänger-Themen 2
U Binärer Suchbaum delete Java Basics - Anfänger-Themen 1
S Binärer Suchbaum - Size als Variabel in innerer Klasse speichern Java Basics - Anfänger-Themen 2
H binärer String nach int convertieren Java Basics - Anfänger-Themen 3
E binärer suchbaum Java Basics - Anfänger-Themen 8
K Binärer Suchbaum Java Basics - Anfänger-Themen 3
D Binärer Suchbaum Java Basics - Anfänger-Themen 11
Q Binärer suchbaum Java Basics - Anfänger-Themen 2
T Binärer String zu Integer Java Basics - Anfänger-Themen 12
Y Binärer Suchbaum Java Basics - Anfänger-Themen 5
S binärer string in negativen int umwandeln Java Basics - Anfänger-Themen 4
C binärer Exponentenbereich bezogen auf das Dezimalsystem Java Basics - Anfänger-Themen 2
M Binärer Suchbaum Höhe Java Basics - Anfänger-Themen 6
G Hoffe jemand kann mir ein paar Tips geben:binärer Suchbaum Java Basics - Anfänger-Themen 3
E Binärer Suchbaum Java Basics - Anfänger-Themen 7
R binärer Suchbaum Java Basics - Anfänger-Themen 1
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
HelpInneed Baum ausgeben (aber mal anders) Java Basics - Anfänger-Themen 3
G AVL-Baum Java Basics - Anfänger-Themen 1
G Rot-Schwarz-Baum Java Basics - Anfänger-Themen 8
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Interface Baum visualisieren Java Basics - Anfänger-Themen 37
CptK Best Practice Merge-Sort als Baum darstellen Java Basics - Anfänger-Themen 3
E Baum pfadweise durchlaufen Java Basics - Anfänger-Themen 11
O Naives links rechts einfügen in ADT Baum Java Basics - Anfänger-Themen 8
L Traversierungsverfahren Baum: LevelOrder Java Basics - Anfänger-Themen 17
L Rekursion im Baum Java Basics - Anfänger-Themen 9
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
L B+Baum innere Knoten erstellen Java Basics - Anfänger-Themen 3
D B-Baum einfügen und löschen Java Basics - Anfänger-Themen 2
D Werte AVL-Baum löschen Java Basics - Anfänger-Themen 2
M Binären Baum Kinder setzen Java Basics - Anfänger-Themen 12
U 2-3-4 Baum Top-Down Java Basics - Anfänger-Themen 4
U 2-3-4 Baum Top-Down Java Basics - Anfänger-Themen 0
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
R Baum erzeugen Java Basics - Anfänger-Themen 61
B Baum Traversierung Postorder Java Basics - Anfänger-Themen 6
B OOP Über einen AVL-Baum iterieren (NullPointer) Java Basics - Anfänger-Themen 5
A Voller Baum Java Basics - Anfänger-Themen 7
S n-ärer Baum Java Basics - Anfänger-Themen 6
O Unterschied Baum <-> Automat Java Basics - Anfänger-Themen 2
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
C kompletter baum Java Basics - Anfänger-Themen 2
M Collections Iterator und generischer Baum Java Basics - Anfänger-Themen 0
M Baum Code kurze frage ... Java Basics - Anfänger-Themen 6
D Ein Objekt in einem Baum finden und ausgeben. Java Basics - Anfänger-Themen 4
K Rot-Schwarz-Baum min und max-Tiefe Java Basics - Anfänger-Themen 1
A min() Methode Baum Java Basics - Anfänger-Themen 1
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
J Baum Knoten löschen Java Basics - Anfänger-Themen 10
T Baum mit Turtle zeichnen Java Basics - Anfänger-Themen 2
Screen 2,4 Baum Frage Java Basics - Anfänger-Themen 6
T Rot-schwarz Baum Problem Java Basics - Anfänger-Themen 3
A Rekursion in Baum und ArrayList als Rückgabe Java Basics - Anfänger-Themen 2
P Pythagoras Baum - Berechnung der Punkte Java Basics - Anfänger-Themen 9
C 2-3 Baum Java Basics - Anfänger-Themen 6
H Baum Java Basics - Anfänger-Themen 4
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
B Baum > Baum-Swing Java Basics - Anfänger-Themen 4
L eigenen Baum schreiben Java Basics - Anfänger-Themen 5
Luk10 Anzahl der Knoten in einem Baum ausgeben! Java Basics - Anfänger-Themen 6
T Array in einen Baum zu überführen Java Basics - Anfänger-Themen 3
S Das reinschreiben einer Klasse in den Baum Java Basics - Anfänger-Themen 6
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
A Baum mit geometricfigur Werte Java Basics - Anfänger-Themen 6
D Datentypen Einfügen im RotSchwarz Baum Java Basics - Anfänger-Themen 2
F FileSystem in Baum darstellen/wurzel festlegen Java Basics - Anfänger-Themen 3
G List als Rückgabewert einer rekursiven Methode (Baum) Java Basics - Anfänger-Themen 3
I Baum graphisch darstellen Java Basics - Anfänger-Themen 2
L Baum Swing AVL Java Basics - Anfänger-Themen 4
Binary.Coder 2-3-4 Baum vs. (2,4) Baum Java Basics - Anfänger-Themen 2
ModellbahnerTT Ab-Baum Applet Java Basics - Anfänger-Themen 3
P Baum-Menü in Java Java Basics - Anfänger-Themen 5
H Baum Java Basics - Anfänger-Themen 11
G AVL Baum Java Basics - Anfänger-Themen 20
J Baum spiegeln Java Basics - Anfänger-Themen 7
N 2-3 Baum, Einfügen Java Basics - Anfänger-Themen 5
G Rekursion mit Return - Baum durchlaufen Java Basics - Anfänger-Themen 4
G Baum Datenstruktur Java Basics - Anfänger-Themen 2
V Baum mit log n Aufwand für Einfügen und Löschen und. Java Basics - Anfänger-Themen 5
H Tiefensuche im binären Baum Java Basics - Anfänger-Themen 2
P Problem mit Darstellung im Baum Java Basics - Anfänger-Themen 4
G universeller baum Java Basics - Anfänger-Themen 13
G Baum testen Java Basics - Anfänger-Themen 20
B Array To Baum Java Basics - Anfänger-Themen 2
B Baum to Array Java Basics - Anfänger-Themen 17
H Löschen in einem binären Baum führt zu einem StackOverflow Java Basics - Anfänger-Themen 2
L Binären Baum speichern Java Basics - Anfänger-Themen 6
R Pythagoras-Baum Java Basics - Anfänger-Themen 5
W Baum durchlaufen Java Basics - Anfänger-Themen 3
G eine Knoten aus einem Baum löschen. [SOLVED] Java Basics - Anfänger-Themen 7
P allg. Baum aus Liste Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben