wieso macht java nicht call by reference?
wenn ich root.left aus add an add(data, parent) übergebe übergebe ich ja nicht die referenz auf diese objekt sodass das geändert wird, sondern nur ne art kopie die keinen verweis auf meine wurzel hat, wie umgehe ich das, sowas sollte doch eine anfängerprogrmamiersprache können
public class Tree {
TNode root;
Tree(){
this.root = null;
}
public void add(int data){
if(root == null){
root = new TNode(data);
}else{
if(data < this.root.data){
add(data, root.left);
System.out.println("miosty");
}else {
add(data, root.right);
}
}
}
public void add(int data, TNode parent){
if(parent == null){
System.out.println("Zu");
parent = new TNode(data);
}else{
if(data < parent.data){
add(data, parent.left);
} else {
add(data, parent.right);
}
}
}
}
Das sollte by-Reference sein. Woran machst du fest, das es das nicht ist? Wie sieht TNode aus?
weil es nicht funktioniert
2 Antworten
Java macht ansich calll by reference, Dein Entwurf ist aber auch ein wenig umständlich und 'nasty'
public void add(int data){
add(int data, root)
}
public void add(int data, TNode current){
if (current==null){
current=new TNode (data);
return;
}
// Gleichheit sollte getrentn behandelt werden.
if (data < current.data) add (data, current.left);
else add (data, current.right);
return;
}
So sollte das strukturell eher aussehen, wobei hier rekursiv gearbeitet wird, man kann das aber genauso gut iterativ ganz ähnlich umsetzen.
P.S.: Du wirst vielleicht im Laufe der weiteren Implementierung merken, daß der Abstieg genauso wie bei der Suche abläuft, sodaß Du ggf. das add über die Nutzung der Suche implementierst.
wieso funktioniert dein code aber meiner nicht, da wird ja auch nichts zurückgegeben, und du machst dann ja auch current = new TNode(data);
Du musst dir das so vorstellen, du hast deine TNode irgendwo im Speicher und dein Programm hat eine Referenz auf dieses Objekt. Wenn du jetzt die Referenz als Argument in eine methode passed, wird eine neue Referenz kreiert die aber auf das selbe Objekt zeigt.
Das heißt wenn du ein neues Objekt erstellt und deine zweite Referenz darauf zeigen lässt, dann verändert sich nichts and deinem orginalen Objekt, und deine erste Referenz zeigt immer noch auf es.
Das heißt der Code im else Block ist fein bei der zweiten überladung von "add()" , aber nicht die Zuweisung "patent = new TNode(data) ;" .
In C würde es nur funktionieren wenn du einen double pointer, also z.B "int **" benutzt. In Java ist es nicht möglich eine Reference by Reference zu passen.
Das hat aber ein anderer Nutzer dir vor ca. 3 Stunden auch geschrieben, in einer Antwort auf quasi die gleiche Frage.
in C hat das aber so ja funktoiniert, wieso hier nicht?