2011-11-21 24 views
-1

因此,我正在实施一个BST,现在我正试图从一个已排序的数组中添加项目。如何添加一个二进制搜索树的元素排序(在C#中)

我有一个递归函数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],它增加了1在阵列的0的位置,然后添加犯规在左子树的位置0处的1(因为当我们进行递归调用时,start = 0,end = -1),然后将另一个1放到右子树中(这是错误的!)。

这是我所看到的是不工作的唯一情况..

任何想法如何解决呢? (我认为这很可能是一个数学错误)

谢谢!

+0

是不是'arr'排序的先决条件? '[1,0]'不是。 –

+0

没错。它不是...我会更新我的上面的例子。我有1.0使它更清楚(比1,1)... – Toadums

+1

间隔是否包容或独占?像[开始,结束]或[开始,结束]? – Tudor

回答

3

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

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; 
+0

当我看到你发布这个时,我只是在打字过程中!哈哈。它工作得很好,谢谢! – Toadums

+0

然后你可以使用'Assert(splitIndex> = start)'等来使你的proc自动记录和自我检查。 –

+0

确定..它实际上不会退出正常工作....如果我添加1 1 1 1 1 1等,在我调用这个dup函数后,其他1的右子树中有1个:(......我有if (开始>结束)返回null ... not> =,如果我添加等于,它会在仔细检查后跳过很多节点 – Toadums