2011-12-13 81 views
1

這種方法有什麼問題?看來,但我不確定樹中鄰近兒童的比較沒有發生。沒有發生樹中相鄰兒童的比較?

我粗略地追溯到該算法通過手的工作,我認爲這個想法是正確的,也許有點毛病執行或我不知道如何遞歸工作,第二個輔助(比較)方法似乎是問題

public static int MAX(BST B) { 
    int m = ((Integer) B.root.data).intValue(); 
    return call(B.root, m); 
} 

public static int call(node current, int max) { 
    //first helper method gets the max from two different levels in the tree 
    if(current == null) 
    return -1; 
    if(current.left == null && current.right == null) 
    return max; 
    else { 
    if(((Integer) current.data).intValue()>max) 
     max = ((Integer) current.data).intValue(); 
    return compare(call(current.left,max),call(current.right,max)); 
    } 
} 

//second helper method gets the max 
static int compare(int m1, int m2) { 
    if(m1>m2) 
    return m1; 
    else 
    return m2; 
} 
+0

添加語言標籤。 – Jon 2011-12-13 22:58:55

回答

3

既然您正在搜索整棵樹,我會假設結構沒有正確排序。

bug是您的通話功能有:

if(current.left==null&&current.right==null) return max; 

想象一下,你有樹有兩個葉子節點(三級節的總)根。根值爲3,右值爲2,左值爲5.算法應返回5,但您的代碼將返回3.這是因爲您忽略任何葉(沒有「子」的節點)的值那行代碼。因此,在此示例中,代碼將忽略值5,並返回max,即3。

您可以通過在left和right爲空時返回compare(current.value,max)來解決此問題。

+0

當然!!謝謝你現在的工作,我對遞歸真的很陌生,但仍然無法說服自己,它的工作原理,但很大的幫助。 – 2011-12-13 23:26:43

+0

高興地幫助:) – 2011-12-13 23:34:54

0

我認爲(不是100%),你可能有問題,因爲你只檢查兩個孩子是否爲空如果權利爲空,而不是你將嘗試在右側和右側調用方法call。也許增加一個案例來檢查一個孩子是否爲空,如果是,返回非空孩子的call

0

...我不知道遞歸是如何工作的?

遞歸意味着你是會從自身內部調用其他一些參數的方法,並有一些檢查,通過退出返回一個值或繼續自我調用遞歸

call()是間接遞歸的,因爲它與-1max返回要麼退出或將其與新的論點再次調用自身,並繼續爲堆棧填滿要做到這一點,直到它要麼退出或崩潰與OutOfMemory錯誤。

該方法不是遞歸的:雖然它名字很差。

static int compare(int m1, int m2) { 
    if(m1>m2) 
    return m1; 
    else 
    return m2; 
} 

,並可以書面(並更名)爲

static int min(final int m1, final int m2) 
{ 
    return Math.min(m1,m2); 
} 

或只是inlined

return Math.min(call(current.left,max),call(current.right,max)); 

無論哪種方式,你所得到的兩個值的minimum,沒有真正的比較他們暗示着不同的邏輯和不同的回報價值。

無論哪種方式是不遞歸的,如果m1 > m2的邏輯是合適的,它不可能是問題,更像是該函數的輸入不是你所期望的。

步驟調試是一個強大的工具,一個經驗豐富的開發人員每天都在使用!