2016-05-18 8 views
0

Ich schreibe eine benutzerdefinierte Binary Search Tree-Klasse, und aus irgendeinem Grund ist der Wert für die Knoten immer verloren. Hier ist meine Methode.Binary Search Tree add Methodenreferenz verloren gehen

private void add(TreeNode node, int a) { 
    if(node==null) { 
     System.out.println("node=null"); 
     node = new TreeNode(a); 

    }else { 
     if(a<node.value) { 
      System.out.println("root > value "+"root: "+node.value+"value: "+a); 

      add(node.left, a); 

     }else { 

      System.out.println("root < value "+"root: "+node.value+"value: "+a); 

      add(node.right, a); 

     } 
    } 
} 

//root is class data 
public void add(int a) { 
    add(root, a); 
} 

Als ich dies ausführen, druckt der Konsolenbildschirm immer Knoten = null aus, die erste if-Anweisung nie falsch überprüft, was bedeutet, Werte eigentlich nie zu meinen Knoten zugeordnet. Ich denke, die Referenz ist irgendwo verloren gegangen, aber ich weiß nicht wo.

+0

Wenn Sie node.left/right übergeben und es null ist, weist Ihr Code der Referenz einen neuen Wert zu, der tatsächlich keinen linken/rechten Knoten erstellt. Fügen Sie Ihren vollständigen Klassencode ein, damit wir Ihnen sagen können, was Sie tun müssen. –

+0

Sie haben den Code nicht eingeschlossen, der 'root' deklariert/initialisiert. Woher sollen wir wissen, warum es null ist? – shmosel

Antwort

1

Probleme sehe ich:

  1. Sie nicht die Wurzel initialisiert wird, wenn notwendig, in dem Code, den Sie verknüpft. Sie erstellen einen neuen Knoten, setzen den Stamm jedoch bei Bedarf nie. (Hinweis: Die erste Einfügung erfordert das Setzen der Wurzel !, könnte dies in Ihrer öffentlichen Methode überprüfen)
  2. Wenn Sie node.left/node.right übergeben, überprüfen Sie nicht immer, ob Sie neue Links setzen müssen/rechte Kinderknoten bei Bedarf

z

Sie verwenden Rekursion, also müssen Sie eine ordnungsgemäße Stoppbedingung haben. Während Ihr Code an einem bestimmten Punkt aufhört, tut er nicht wirklich, was Sie wollten. Für die Korrektheit müssen Sie sicherstellen, dass Sie neue Kindknotenverweise festlegen (oben im Code angegeben). Wenn Sie nach links rekursiv sind, propagieren Sie neue Werte in Ihrem BST, bis Sie schließlich einen neuen Blattknoten erstellen müssen. Ähnliches soll passieren, wenn man sich den Baum hinunter rekursiert.

In Ihrem Fall übergeben Sie die Werte für den linken/rechten Knoten immer nur, bis eine Null erreicht ist, und aktualisieren nie die Referenzen der untergeordneten Knoten.