Я возвращаюсь на Java после долгого времени с помощью C и был пойман на простой концепции. Я начал писать базовую реализацию BST, чтобы вернуть свои данные, и подумал, что я понимаю передачу параметров передачи по значению Java (да, я понимаю, что даже ссылки на объекты передаются по значению, очень распространенное недоразумение).Параметр Java, проходящий в bst implementationaion
Я реализую функцию добавления рекурсивно, как показано в приведенном ниже коде, однако я обнаружил, что, если я фактически не вернул значения узлов, это не сработает. Я прокомментировал строки, которые не работают, и заменил их линиями, которые работают для сравнения.
Я думал, что, поскольку копия ссылки на фактический корневой узел передается функции добавления, изменения, выполняемые в каждом вызове функции, выполняются на фактическом объекте в памяти, поэтому, если я добавил узел влево или вправо, его следует сохранить.
Я чувствую себя очень смущенным, потому что знаю, что мне, должно быть, не хватает чего-то действительно простого здесь, но чтение о передаче java-аргументации заставляет меня задаться вопросом, почему я ошибаюсь. Спасибо за помощь.
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);
}
}`
Если ваш корень равен нулю, вам необходимо установить его на что-то. Если вы передаете null для добавления (node, item), вы создаете новый узел, но он не ссылается нигде вне функции, пока вы не вернете его и не сделаете с ним что-то. –
Конечно! Спасибо, что у меня было туннельное видение! – rf22