如何将已排序的元素数组添加到二叉搜索树(在c#中)

如何将已排序的元素数组添加到二叉搜索树(在c#中),c#,binary-tree,C#,Binary Tree,所以我正在实现一个BST,现在我正在尝试添加排序数组中的项 我有一个递归函数Dup: private BNode Dup(T[] arr, int start, int end) { if (start > end) return null; BNode sub_root = new BNode(arr[(int)Math.Ceiling((double)((start + end) / 2))]); sub_root.Left = Dup(arr, start

所以我正在实现一个BST,现在我正在尝试添加排序数组中的项

我有一个递归函数Dup:

private BNode Dup(T[] arr, int start, int end) {

    if (start > end) return null;

    BNode sub_root = new BNode(arr[(int)Math.Ceiling((double)((start + end) / 2))]);
    sub_root.Left = Dup(arr, start, (start + end) / 2 - 1);
    sub_root.Right = Dup(arr, (start + end) / 2 + 1, end);
    return sub_root;

}
但是如果我将它传递到一个类似于[1,1]的数组中,它会在数组的0处添加1,然后不在左子树的0处添加1(因为当我们进行递归调用时,start=0,end=-1),然后将另一个1放入右子树(这是错误的!)

这是我能看到的唯一一个不起作用的例子

有没有办法解决这个问题?(我认为这很可能是一个数学错误)


谢谢

为什么不重用相同的拆分索引?比如:

int splitIndex = (int)Math.Ceiling((double)(start + end) / 2);
BNode sub_root = new BNode(arr[splitIndex]);
sub_root.Left = Dup(arr, start, splitIndex  - 1);
sub_root.Right = Dup(arr, splitIndex + 1, end);
return sub_root;

排序
arr
不是一个先决条件吗<代码>[1,0]不正确。它不是…我将更新我的上述示例。我用了1,0来更清楚地说明(比1,1)…间隔正确吗?像[start,end]或[start,end]吗?我刚在打字的过程中看到你发布了这个!!哈哈。效果很好,谢谢!然后你可以使用
Assert(splitIndex>=start)
etc以使您的进程自我记录和自我检查。好的..它实际上并没有正确地停止工作…如果我添加1 etc,在调用此dup函数后,在其他1的右子树上有1:(…我有if(开始>结束)返回null…not>=,如果我加上equals,它会跳过很多节点经过仔细检查,如果树允许重复值,我认为它不会起作用