2011-11-21 47 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