2017-03-04 41 views
0

我已經制作了一個通用Binary Heap(MaxHeap),其中我必須根據節點中存在的值搜索特定節點。我已經完成了使用Pre-OrderTraversal的搜索功能,並且它應該給出Order n的運行時間,其中n是堆中節點的數量。我的代碼似乎不工作。它永遠不會進入preOrderT函數中的第二個'else if'。你能建議可以做些什麼改變嗎?堆的搜索功能

我的節點類已被定義爲包含一個整數鍵(根據這個鍵排列堆),一個通用對象值以及對父類leftChild和rightChild的引用。

public Node<E> search(E p){ 
    Node<E> N; 

    N= preOrderT(root, p); 
    return N; 
} 

public Node<E> preOrderT(Node<E> N, E p){ 
    Node<E> M=null; 

    if (N.value==p) M=N; 
    else if (M==null && N.leftChild!=null){ M=preOrderT(N.leftChild, p);} 
    else if (M==null && N.rightChild!=null){ M=preOrderT(N.rightChild, p);} 
    return M; 
} 
+0

'println'是你的朋友 - '調用println( 「N.value:」 + N.value + 「P」 + P);',看看發生了什麼事情 – rbellamy

回答

2

的問題是,如果有一個leftChild,那麼你永遠不給它一個機會來檢查rightChild。相反,一旦您完成檢查leftChild,請檢查rightChild是否尚未找到該值。

+0

我還是不明白爲什麼它不會進入第二'其他如果'。如果第一個else if循環給出了M的空值,那麼程序是否應該進入第二個else? – Avi

+0

因爲如果第一個「else if」通過,第二個「else if」將永遠不會運行,而不管第一個體的結果如何。 – Jeremy

0

你需要更新你的函數爲:如下

public Node<E> preOrderT(Node<E> N, E p){ 
Node<E> M=null; 

if (N.value==p) M=N; 
else 
{ 
    if (N.leftChild!=null){ M=preOrderT(N.leftChild, p);} 
    if (N.rightChild!=null){ M=preOrderT(N.rightChild, p);} 
} 
return M; 

}

+0

謝謝。我一直被困在這個問題上兩個小時,無法弄清楚出了什麼問題。我的代碼在我進行建議編輯後工作。 – Avi

+0

我還是不明白爲什麼它沒有進入第二'其他如果'。如果第一個else if循環給出了M的空值,那麼程序是否應該進入第二個else? – Avi

+0

'else if'僅在'if'未執行時執行。在你的情況中,你有這種情況: 'if'和'else if'以及'else if'這樣一次只能執行這三種情況中的一種。在你的情況下,只有前兩個條件不滿足時,last else纔會被執行。也就是說,當「N.value不等於p」和「N.leftChild等於null」時,只會檢查第三個「else if」條件。 –

0

變化。

if (N.value==p) M=N; 
    else { 
     if (M==null && N.leftChild!=null){ M=preOrderT(N.leftChild, p);} 
     if (M==null && N.rightChild!=null){ M=preOrderT(N.rightChild, p);} 
} 
+0

謝謝你。我一直被困在這個問題上兩個小時,無法弄清楚出了什麼問題。我的代碼在我進行建議編輯後工作。 – Avi

+0

我還是不明白爲什麼它不會進入第二個'其他如果'。如果第一個else if循環給出了M的空值,那麼程序是否應該進入第二個else? – Avi