Java 当只引用其副本时,我的二叉搜索树的顶部节点是如何更新的

Java 当只引用其副本时,我的二叉搜索树的顶部节点是如何更新的,java,linked-list,binary-search-tree,shallow-copy,Java,Linked List,Binary Search Tree,Shallow Copy,这个问题也适用于各种链表方法。所以,当我有了一个方法: public void insert(String key) { if(top == null) { top = new Node(key); }else { Node newNode = new Node(key); Node rover = top;

这个问题也适用于各种链表方法。所以,当我有了一个方法:

    public void insert(String key) 
    {

        if(top == null) 
        {
            top = new Node(key);
            
        }else {
            Node newNode = new Node(key);
            Node rover = top;
            Node prev = top;
            boolean wentLeft = true;

            while(rover != null) 
            {
                if (rover.getName().compareTo(key) < 0)
                {
                    prev = rover;
                    rover = rover.getRight();
                    wentLeft = false;
                }else {
                    wentLeft = true;
                    prev = rover;
                    rover = rover.getLeft();
                }
            
            }
                
            if(wentLeft == true) 
            {
                prev.setLeft(newNode);
            }else {
                prev.setRight(newNode);
            }
        }
        nElems++;
        
    }
public void插入(字符串键)
{
if(top==null)
{
top=新节点(键);
}否则{
Node newNode=新节点(键);
节点漫游者=顶部;
节点prev=顶部;
布尔wentLeft=true;
while(rover!=null)
{
if(rover.getName().compareTo(键)<0)
{
prev=月球车;
rover=rover.getRight();
wentLeft=假;
}否则{
wentLeft=真;
prev=月球车;
rover=rover.getLeft();
}
}
如果(wentLeft==true)
{
上一个setLeft(新节点);
}否则{
上一个设置权限(新节点);
}
}
nElems++;
}
如何更新二叉搜索树的顶部及其子级,尽管没有直接设置在方法中的任何位置

我知道这可能与浅拷贝有关,像罗孚/普雷夫一样仍然引用内存中的top,但我还是不太明白


尽管我感觉自己在概念层面上理解了链表和二元搜索树,但如果不理解这一点,我就很难继续使用它们。

没有复制品。指定prev=top时,这只会创建与top相同对象的另一个引用,而不是副本

代码之所以有效,是因为节点是逐个插入的。 调用prev.setLeft/setRight时,prev已在树中,因为它是在之前插入的。所以prev已经在树上了,i。Eprev的父对象是top,或者prev的父对象的父对象,你明白了。因此,当新的_节点成为prev的子节点时,它将成为树的一部分


这就是链表和树如此有用的原因。插入元素时,只需建立一个连接。

您认为问题中的代码有什么作用?我不确定您不理解代码的哪一部分。你还不清楚什么?@PM77-1我知道它会根据它的值为树添加一个新的任意键节点,关于它是否小于或大于top,然后是top的左/右子节点等。我不明白,当我在顶部为“香蕉”的树中插入类似“苹果”的语句后,如何再也不重置或使用top它实际上是如何被设置到它的左边的,而实际上没有说top.setLeft(“apple”)或prev.setLeft(“apple”),然后是top.setLeft(prev)。我不是在问代码做了什么,而是为什么和如何工作。为了澄清:prev=top不会创建浅拷贝。我想这是你误解的一点。在prev=top之后,top.setLeft(x)和prev.setLeft(x)执行完全相同的操作!因为我引用的是top,所以我可以使用prev或rover遍历它,而不必更改top,然后根据这些节点在列表中的位置添加到它?是的,没错!当代码使用prev和rover遍历树时,Top仍然“指向”同一元素。像C这样的低级语言更清楚指针的概念,但也更详细。在Java中,当您有一个对象(通常类型以大写字母开头,如字符串或节点)时,a=b只创建另一个指向b的指针,指向同一个对象。要创建另一个对象,必须主动创建副本。这与int和float等基本类型不同。