Java 为什么必须为二叉树的递归插入显式设置左/右子级?
我只是在玩一个二叉树,我很好奇为什么第一个实现可以工作,而第二个没有。我忽略了什么?我觉得这很琐碎,但我还是很想念它 1: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的上一次递归调用中的节点变量实际上没有引
//只是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);
}