2013-08-04 102 views
1

我想構建一個二叉搜索樹給定一個排序值的ArrayList。在嘗試創建最有效的樹時,我可以取中間值並將其添加到樹中。然後遞歸地取最左邊的值,並找到那些進入樹的值的中間值。遞歸調用一個方法來構建二叉搜索樹

一旦完成相同的事情就完成了右側。

我所說的balanceBST()方法用下面的行:

balanceBST(iterator.list, 0, iterator.list.size() - 1); 

鑑於iterator.list是在包含值的時刻的整數的ArrayList:
{5,17,24,31, 44,55,71,81,82,83,84,85,97}

public void balanceBST(ArrayList<E> values, int start, int end){ 
    int mid = (start + end)/2; 
    while(mid >= 0 && end > mid){ 
     insert(values.get(mid)); 
     balanceBST(values, start, mid - 1); 
     balanceBST(values, mid + 1, end); 
    } 
} 

所述插入件(元件)方法完成進入東西進入該二進制樹的腿部工作。

這是產生各種各樣的錯誤,我認爲它發生在中期接近0或當末端接近中期它弄糟了,但我自己跟着邏輯,我不明白爲什麼這是崩潰。

編輯:

對於那些在未來非常感謝@大衛閱讀本。下面的解決了這一問題:

public void balanceBST(ArrayList<E> values, int start, int end){ 
    int mid = (start + end)/2; 
    if(end < 0 || start > end) return; 
     insert(values.get(mid)); 
     balanceBST(values, start, mid - 1); 
     balanceBST(values, mid + 1, end); 
    } 

回答

2

當你正在做遞歸調用balanceBST你不想while循環,這將導致條目被反覆插入。將時間改爲終止測試並返回。注意只在兩者都是假時插入> = 0和<結束並退出。