Ich bin nach einer langen Zeit mit C nach Java zurückgekehrt und bin auf einem einfachen Konzept gefangen worden. Ich fing an, eine grundlegende BST-Implementierung zu schreiben, um mich zu orientieren, und dachte, ich würde Javas Pass-by-Value-Parameterübergabe verstehen (ja, ich verstehe, dass sogar Objektreferenzen wertmäßig weitergegeben werden, ein sehr häufiges Missverständnis).Java-Parameter übergeben in bst Implementierung
Ich implementiere die Add-Funktionalität rekursiv wie im folgenden Code gezeigt, aber ich fand, dass, wenn ich nicht wirklich die Knotenwerte zurückgeben, es nicht funktioniert. Ich habe die Zeilen, die nicht funktionieren, auskommentiert und sie durch die Zeilen ersetzt, die zum Vergleich dienen.
Mein Gedanke war, dass, weil eine Kopie des Verweises auf den tatsächlichen Wurzelknoten an die Add-Funktion übergeben wird, die Änderungen in jedem Funktionsaufruf auf dem tatsächlichen Objekt im Speicher getan werden, also wenn ich einen Knoten hinzugefügt habe zum linken oder rechten Zweig sollte es beibehalten werden.
Ich fühle mich sehr beschämt, weil ich weiß, dass ich etwas wirklich einfaches hier vermissen muss, aber das Lesen über Java-Argument, das vorübergeht, lässt mich mich wundern, warum ich mich irre. Danke für die Hilfe.
public class BinaryTree {
TreeNode root;
public BinaryTree(){
root = null;
}
void add(int item){
root = add(root,item);
//add(root,item);
}
//public void TreeNode add(TreeNode node, int item){
public TreeNode add(TreeNode node, int item){
if(node == null){
node = new TreeNode(item);
} else if(item <= node.getItem()){
node.setLeft(add(node.getLeft(),item));
//add(node.getLeft(),item);
} else if(item > node.getItem()){
node.setRight(add(node.getRight(),item));
//add(node.getRight(),item);
}
return node;
//return;
}
static void printTree(BinaryTree tree){
printTree(tree.root);
}
static void printTree(TreeNode node){
if(node == null){
System.out.println("Tree Empty");
return;
}
if(node.getLeft() != null)
printTree(node.getLeft());
if(node.getRight() != null){
System.out.print(node.getItem()+ ", ");
printTree(node.getRight());
} else {
System.out.print(node.getItem()+ ", ");
}
return;
}
public static void main(String args[]){
BinaryTree tree1 = new BinaryTree();
tree1.add(10);
tree1.add(3);
tree1.add(5);
printTree(tree1);
}
}`
Wenn Ihr root null ist, müssen Sie es auf etwas setzen. Wenn Sie null übergeben, um hinzuzufügen (Knoten, Element), erstellen Sie einen neuen Knoten, aber es wird nirgendwo außerhalb der Funktion referenziert, bis Sie es zurückgeben und etwas damit tun. –
Natürlich! Danke, ich hatte Tunnelblick! – rf22