如何在java中构建段树?

如何在java中构建段树?,java,data-structures,segment-tree,Java,Data Structures,Segment Tree,在构建段树之后,我必须搜索范围[3,5]之间的数字总和。对于树的构造,我执行以下代码 public static void main(String[] args) { int arr[] = { 1, 3, 5, 7, 9, 11 }; int n = arr.length; int tree[] = new int[2 * n]; buildtree(arr, tree, 1, 0, n - 1); // index starts

在构建段树之后,我必须搜索范围[3,5]之间的数字总和。对于树的构造,我执行以下代码

public static void main(String[] args) {
        int arr[] = { 1, 3, 5, 7, 9, 11 };
        int n = arr.length;
        int tree[] = new int[2 * n];
        buildtree(arr, tree, 1, 0, n - 1); // index starts from 1
        Arrays.toString(tree).toString();
    }

    static int buildtree(int arr[], int tree[], int index, int ts, int te) {
        if (ts == te) {
            tree[index] = arr[ts];
            return arr[ts];
        }

        int mid = (ts + te) / 2;
        tree[index] = buildtree(arr, tree, (2 * index), ts, mid) + buildtree(arr, tree, ((2 * index) + 1), mid + 1, te);
        return tree[index];
    }

在存储[3,3]的值时,我得到了一个异常数组索引。我哪里出错了?

无关:你认为数组。toString(树)。toString()有什么作用,为什么你相信?数组需要大两个,即
int[]tree=new int[2*n+2]
为什么你认为调用返回字符串值的
toString()
会打印该字符串值?要打印某些内容,您需要调用
print()
,如以前创建的任何控制台程序的“Hello World”教程所示。我强烈建议你通过这样一个教程,学习如何从Java打印。哦,我现在明白了。我错过了SOP部分。但我最关心的是排列索引。在许多教程中,我看到树的大小被初始化为原始数组的(2n)。你提出(2n+2)有什么具体原因吗?我收回这一点,这不是正确的解决方案。我建议您只需创建过大的数组,这样就不会出现错误,然后调试代码以查看数组是如何构建的,并了解逻辑哪里出错。我实际上不知道结果数组应该是什么---