2016-09-28 32 views
0

例如,在这种方法,该方法建立的排序从BST如何在递归时将值存储到数组中?

public E[] inOrderSort(TreeNode tree){ 
    E[] array1 = new E[tree.size]; 
    inOrder(tree, array1, 0); 
    return array1; 
} 

public void inOrder(TreeNode node, E[] array, int index){ 
    if(node == null){ 
     return; 
    } 
    inOrder(node.getLeft(), array, index); 
    array[index++]= node.getData();   
    inOrder(node.getRight(), array, index); 
} 

这里的数组,我怎么得到当inOrderSort方法返回阵列1正确的结果? Java是如何将inOrderSort中的方法中声明的array1传递给inOrder方法的,可以通过inorder排序来填充array1的值?我认为Java是通过引用不通过价值?

+4

的[可能的复制就是Java“通过逐引用“或”按值传递“?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) – nhouser9

回答

0

Java对所有对象类型使用基于引用的引用,但基元类型是按值调用的。

在你的情况下,index是一个原始类型将不会保持递归跨的值。 index将像本地变量一样工作,其范围仅限于函数调用堆栈跟踪,其中作为对象的array1将作为引用传递,并且可以在递归中保留其值,因为它的范围是java堆。使用返回值

尝试:

public E[] inOrderSort(TreeNode tree){ 
    E[] array1 = new E[tree.size]; 
    int index = 0; 
    index = inOrder(tree, array1, index); 
    if(index != tree.size){ 
     //error 
    } 
    return array1; 
} 

public int inOrder(TreeNode node, E[] array, int index){ 
    if(node == null){ 
     return index; 
    } 
    index = inOrder(node.getLeft(), array, index); 
    array[index]= node.getData();   
    index++; 
    index = inOrder(node.getRight(), array, index); 
    return index; 
} 
+1

_stack_由_stackframes_ ,如果_stack_是范围,那么它对所有或至少后续帧都是可见的。如果不是堆,所有的本地变量应该保存在非堆内存中?最后,一个'Integer'应该如何在不可变的情况下提供帮助?它是价值的对象表示,而不是它的容器。 –

+0

@GeraldMücke谢谢..Slipped不变性因素,所以修改了代码片段。理论上也进行了修正。 –

+0

@GeraldMücke有没有可用于本地变量而不是堆栈帧的地方? –

0

变量ARRAY1是阵列对象的引用。将array1传递给方法时,可以通过值(引用的值)传递它,然后可以通过inOrder()方法中的该引用修改对象。

1

原始值是按值传递的。因此,对inOrder中的index变量所做的任何操作都不会影响调用方。该数组不是一个基元,并且通过引用传递,因此,调用者可以看到对它的任何修改。

现在你有两个选择:

  • 包裹在一个对象的索引位置(Integer,因为它是不可变的,AtomicInteger会做,作为int[]一个元素相同) - 但我不会”不要这样做,因为该方法的意图是对数组应用排序而不更新索引。索引只不过是排序函数的一个提示。
  • 回报新指数的结果,并在下面的调用使用它(我更喜欢这个)

例如:

public int inOrder(TreeNode node, E[] array, int start){ 
    if(node == null){ 
    return; 
    } 
    int index = inOrder(node.getLeft(), array, start); 
    array[index++]= node.getData();   
    return inOrder(node.getRight(), array, index); 
}