我正在开发一个构造二叉树的Java实现,给定pre / inorder遍历数组。
代码看起来像这样(似乎工作但我没有进行过广泛的测试)
public static TreeNode buildTree(int[] inOrder, int[] preOrder) {
if(inOrder.length <= 0 || preOrder.length <= 0) {
return null;
}
final TreeNode root = new TreeNode(preOrder[0]);
final int i = indexOf(inOrder, root.getValue());
root.setLeft(buildTree(Arrays.copyOfRange(inOrder, 0, i),
Arrays.copyOfRange(preOrder, 1, i + 1)));
root.setRight(buildTree(Arrays.copyOfRange(inOrder, i + 1, inOrder.length),
Arrays.copyOfRange(preOrder, i + 1, preOrder.length)));
return root;
}
然而,这让我想到了java中数组切片的最佳实践。由于copyOfRange()返回一个新数组,这个解决方案的内存效率是否很低?
或者JavaVM足够智能,可以在创建所有这些类似的子数组时重用内存。
(我知道我可以用函数签名中的开始/结束索引重写这个函数。我的问题更多的是,在Java中是否可以像这样做数组切片)