当我在Java中将数组作为函数参数传递时,请说:
public static void main(String... args){
int[] in=new int[]{57,40...23};
int[] post=new int[]{50,18...0};//arrays abbreviated for expediency
treeNode tree=buildTree(in, post);
print(tree);
}
public static treeNode buildTree(int[] in, int[] post)
{
int root_data= post[(post.length)-1];
int root_index=search(root_data, in);
treeNode root=new treeNode(root_data);
root.setLeft(buildTree(subArray(in, 0, root_index),subArray(post, 0, root_index)));
root.setRight(buildTree(subArray(in,root_index+1, in.length),
subArray(post,root_index, post.length-1)));
return root;
}
public static int[] subArray(int[] array, int start, int end)
{
int[] result=new int[end-start];
for(int i=0; i<end-start;i++)
{
result[i]=array[start+i];
}
return result;
}
public static int search(int key, int[] array)
{
for(int i=0; i<array.length; i++){
if(array[i]==key)
return key;
}
return array.length;
}
我收到arrayIndexOutOfBounds
个例外。通过调试器,我神秘地发现数组变为长度为0.这是为什么?
答案 0 :(得分:1)
在search()
方法中,您可能希望返回i
而不是key
。由于您稍后使用root_index
变量(使用此函数找到)作为数组索引,因此可能会遇到麻烦(arrayIndexOutOfBounds
异常抛出)。即使root_index
在数组索引的范围内,它的值仍然是错误的 - 确切地说,它在您的示例中是0
,而subArray()
方法返回空数组。
您可能需要考虑使用标准工具而不是自己的方法:
Arrays.sort()
后跟Arrays.binarySearch()
进行搜索:即使渐渐地比你的简单搜索更糟糕 - O(n * lon(n))要排序加O(log(n) )在你的情况下二进制搜索与O(n) - 考虑到你可能有小数组这仍然是合理的,但你得到了保证算法的正确性Arrays.copyOfRange()
复制数组范围另外,我没有看到treeNode
类的任何定义,但为了简洁起见,我猜你在发布的代码中省略了它。
关于样式的快速说明:在Java中,使用camelCase调用变量和方法(因此您可能希望将root_index
重命名为rootIndex
,依此类推)并且类从上层开始 - 大小写字母(所以treeNode
最好命名为TreeNode
)。它可以使您的代码在阅读时更加(直观)易于理解。
希望有所帮助!