2016-10-12 4 views
1

Wenn ich implementieren einfügen und Drucken im binären Suchbaum. es druckt nur den ersten Wurzelknoten aus. Bitte helfen Sie warum? Grundlegende Implementierung von binären Suchbäumen, beginnend damit, sie zu lernen und mit ihnen fortgeschrittenere Dinge zu bewegen, aber beim ersten Schritt zu stolpern. Es sieht so aus, als ob die Knoten nicht zum Root-Knoten hinzugefügt werden.Scheint nicht in binäre Suchbaum einfügen

class bstrees{ 
class Node 
{ 
    int data; 
    Node left; 
    Node right; 
    public Node(int data) 
    { 
     this.data=data; 
     this.left=null;  
     this.right=null; 
    } 
} 
Node root; 
bstrees(){root=null;} 

public void insert(int data){ 
    root=insert_node(root,data); 
} 
public Node insert_node(Node r,int n){ 
    if(r==null){ 
     Node n1=new Node(n); 
     //root=n1; 
     return n1 ; 
    } 
    else if(root.data<=n){ 
     insert_node(root.right,n); 
    } 
    else{ 
     insert_node(root.left,n); 
    } 
    return r; 
} 
public void print_t(){ 
    print_t(root); 
} 
private void print_t(Node r){ 
    //System.out.println(r); 
    if(r!=null){ 

    // System.out.println(r.left);   
    // System.out.println(r.right); 
     print_t(r.left); 
     System.out.println(r.data+" "); 
     print_t(r.right); 
    } 

} 


} 
public class BST_prac { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    bstrees b1=new bstrees(); 
    b1.insert(5); 
    b1.insert(1); 
    b1.print_t(); 

} 

} 

Es druckt nur 5.

+0

scheint auf den ersten Blick/nicht einmal testen Code, dass Sie zunächst für null überprüfen möchten, finden Sie [hier] (http://stackoverflow.com/questions/5560679/inserting-nodes-into-a -binary-tree-in-java-question) –

+0

Bitte lesen Sie über Java-Namenskonventionen. Klassennamen beginnen Großschreibung; Sie kürzen nicht ab (BinaryTree ist so viel besser zu verstehen als bstree, nicht wahr), und Sie verwenden nur _ _ char für SOME_CONSTANTS, aber nicht für Variablen und Methodennamen. – GhostCat

+1

Und für die nächste Frage: Sie möchten, dass wir unsere Zeit nutzen, um Ihnen zu helfen, also bitte verwenden Sie die Zeit, um Ihren Quellcode richtig zu formatieren. Und schließlich: ** zwei ** öffentliche Methoden, die beide zum Einfügen sind, ist einfach eine super-verwirrende Schnittstelle (wie Sie vielleicht gesehen haben, wie ich zuerst eine falsche Antwort gab). Die Sache ist: Ihr Code ist ** schwer ** zu lesen; obwohl es so einfach sein sollte. Zu guter Letzt: Sie könnten das Problem selbst leicht beheben, indem Sie nach den entsprechenden Aktionen Druckanweisungen in Ihren Code einfügen. oder indem Sie einen ** Debugger ** ausführen. – GhostCat

Antwort

3

In dem Aufruf, der den Wert 1 in den Baum eingefügt, der Aufruf an insert_node(root.left,n) einen neuen Knoten erzeugt, aber kein Hinweis auf diese neu erstellten Knoten gespeichert ist, die bedeutet, dass der Baum selbst nicht verändert wird. Die Referenz sollte im Elternknoten des neu erstellten Knotens gespeichert werden; Gleiches gilt für das Einfügen von Knoten in den rechten Teilbaum.

+0

Schätzen Sie es Codor. Ich habe den Code nach unten geändert und er fügt richtig ein und druckt. –

+0

Öffentliche Knoten insert_node (Node r, int n) { \t \t if (r == null) { \t \t \t Knoten n1 = neue Knoten (N); \t \t \t Rückkehr n1; \t \t} \t \t else if (root.data <= n) { \t \t \t root.right = insert_node (root.right, n); \t \t } \t \t else { \t \t \t root.left = insert_node (root.left, n); \t \t} \t \t zurück r; –

+1

@varunjana Tun Sie das nicht. Wenn seine Antwort den richtigen Weg nahm, akzeptiere es einfach. Es hat keinen Sinn, Code in unlesbaren Kommentaren zu stopfen. – GhostCat

0

Wenn Sie einen neuen Knoten einfügen, wie von Codor erwähnt, werden die Referenzen des übergeordneten Knotens nicht gespeichert, z. B. ob Sie zum linken Knoten oder rechten Knoten hinzufügen möchten. Immer wird ein neuer Knoten erstellt. Ich habe kleine Änderungen vorgenommen, damit Ihr Code in der Einfügemethode funktioniert.

public void insert(int data){ 
     //creating root node if root node itself is null 
     if(root==null){ 
      root =new Node(data); 
     } else { 
      root=insert_node(root, data, null, null); 
     } 
     //System.out.println("after insert root data is " + root.data); 
    } 
    public Node insert_node(Node node, int n, String dir, Node parent){ 
     //traverse and insert in proper nodes 
     //assign left or right child based on some logic i have taken direction as string here. 
     if(node == null) { 
      Node n1 = new Node(n); 
      if(dir.equalsIgnoreCase("left")) { 
       parent.left = n1; 
      } else { 
       parent.right = n1; 
      } 
     } 
     else if(root.data<=n){ 
      parent = root; 
      insert_node(root.right, n, "right", parent); 
     } 
     else{ 
      parent = root; 
      insert_node(root.left, n, "left", parent); 
     } 
     return root; 
    } 
+0

Hallo Asif, sollte es nicht sein: –

+0

'Code' Knoten.Daten <= n –

+0

'öffentlicher Knoten insert_node (Knotenknoten, int n, Zeichenverzeichnis, Knotenübergeordnete) { \t \t if (Knoten == null) { \t Knoten n1 = neuer Knoten (n); \t if (dir == 'l') { \t parent.left = n1; \t} sonst { \t parent.right = n1; \t } \t } \t else if (node.data <= n) { \t parent = Knoten; \t insert_node (node.right, n, 'r', Eltern); \t} \t else { \t parent = Knoten; \t insert_node (node.left, n, 'l', Eltern); \t} \t zurück root; ' –

Verwandte Themen