Java 为什么必须为二叉树的递归插入显式设置左/右子级?

Java 为什么必须为二叉树的递归插入显式设置左/右子级?,java,recursion,parameter-passing,binary-tree,Java,Recursion,Parameter Passing,Binary Tree,我只是在玩一个二叉树,我很好奇为什么第一个实现可以工作,而第二个没有。我忽略了什么?我觉得这很琐碎,但我还是很想念它 1: //只是insertTree方法的包装器。 公共void insertKey(int key){ if(root==null)//私有“Node”变量。 根=新节点(键); 其他的 插入树(键,根); } //递归插入加工 私有void insertTree(int键,节点) { if(key它不起作用的原因是,对insertTree的上一次递归调用中的节点变量实际上没有引

我只是在玩一个二叉树,我很好奇为什么第一个实现可以工作,而第二个没有。我忽略了什么?我觉得这很琐碎,但我还是很想念它

1:
//只是insertTree方法的包装器。
公共void insertKey(int key){
if(root==null)//私有“Node”变量。
根=新节点(键);
其他的
插入树(键,根);
}
//递归插入加工
私有void insertTree(int键,节点)
{

if(key它不起作用的原因是,对
insertTree
的上一次递归调用中的
节点
变量实际上没有引用与其前面调用中的
节点相同的内存位置。left
。调用函数(/method)有效地为堆栈上的所有参数创建新的存储位置,并将参数值复制到该位置

因此,在第二个变量中,
insertTree
只需创建一个新的
节点
,并将其分配给该函数中的局部变量
节点
。该分配不会影响其他内存位置。然后它返回,新的
节点
将永远丢失


您声明“Java是通过引用传递的”,但事实并非如此。Java按值传递引用。

您不应该使用递归将元素添加到二叉树中。递归涉及昂贵的隐式堆栈。您应该简单地进行迭代以找到添加节点的正确位置。此外,当您使用迭代时,不需要两种方法来完成此工作—一种是enough、 请看以下非常简单的代码:

我就知道它很简单!当然,
新的
节点并没有真正附加到参数上。该死。不过谢谢:)
//just a wrapper around the insertTree method.
public void insertKey(int key){
    
    if(root==null) //a private 'Node' variable.
        root = new Node(key);
    else
        insertTree(key, root);
}

//recursive insert - working
private void insertTree(int key, Node node)
{
    if(key <= node.getKey())
    {
        if(node.left!=null)
            insertTree(key, node.left);
        else
            node.left = new Node(key); //explicitly setting left child
    }
    else
    {
        if(node.right!=null)
            insertTree(key, node.right);
        else
            node.right = new Node(key); //explicitly setting right child
    }
            
}
private void insertTree(int key, Node node)
{  //if node is null, create a new node. Can be either node.left or node.right
       if(node==null)
       {
           node = new Node(key);
           return;
       }
       else
          if(key <= node.getKey())
             insertTree(key, node.left);
          else
             insertTree(key, node.right);
                                
}