2016-04-30 139 views
0

這是一種方法來查找特定的節點在二叉搜索樹...... 我不知道有什麼問題嗎,但由於某種原因這個代碼不正常..任何幫助?什麼是錯誤的代碼(BST)

public KAUstudent findNodeName(String fName, String lName){ 
    return findNodeName(root, fName, lName); 
} 

public KAUstudent findNodeName(KAUstudent p , String fName, String lName){ 
    if (p == null) 
    return null; 
    else { 
    // if the data we are searching for is found at p (at the current root) 
     if (fName.equalsIgnoreCase(p.getFirstName()) && lName.equalsIgnoreCase(p.getLastName())) 
      return p; 
     else if ((fName.compareToIgnoreCase(p.getFirstName())< 0) || (lName.compareToIgnoreCase(p.getLastName()) <0)) 
       return findNodeName(p.getLeft(), fName, lName); 
     else 
       return findNodeName(p.getRight(), fName, lName); 
} 
} 
+0

請解釋這意味着什麼不正常。它在做什麼與你期望的? – ChiefTwoPencils

+0

如果名稱存在於樹中,它應該返回節點。否則它應該返回null。但有時它會返回null,即使名稱exsit – Chie

回答

-1

我猜這就是問題所在

if (fName.equalsIgnoreCase(p.getFirstName()) && lName.equalsIgnoreCase(p.getLastName())) 
      return p; 

它只返回p如果兩個都是如此。嘗試將&&更改爲||。由於它是BST,所以正確的名字和姓氏可能不在樹的同一層。 您可以將姓氏中的第一個合併到單個字符串中並進行搜索。如果你想知道如何做,只需評論,我會解釋代碼。

+0

有人可以解釋爲什麼這是被投票嗎?這是一個完全合理的答案 – sbowde4

+0

我也試過這個。我仍然有同樣的問題:/ *在BST每個節點是一個學生的記錄,這樣的姓氏和名字都在同一節點 – Chie

+0

哦,我並沒有意識到這一點。我以爲你只是在樹中插入第一個列表和姓氏列表。 – sbowde4

0

的主要問題是,你不必爲你的鑰匙一個適當的「偏序」。關鍵比較邏輯需要是這樣的:

when majorkey1.compareTo(majorkey2) < 0 : 
     // less than 
    when majorkey1.compareTo(majorkey2) == 0 AND 
     minorkey1.compareTo(minorkey2) < 0 : 
     // less than 
    when majorkey1.compareTo(majorkey2) == 0 AND 
     minorkey1.compareTo(minorkey2) == 0 : 
     // equal to 
    when majorkey1.compareTo(majorkey2) > 0 : 
     // greater than 

但這不是你的代碼實現。

更新 - 修正版本或多或少是正確的。 (最終else是多餘的,請仔細閱讀代碼,並想想...你應該能夠明白爲什麼我說。)


問題#2:在代碼中,你建樹,你完全使用錯誤的關鍵。在搜索樹時以及決定向樹中添加新節點的位置時,您需要使用相同的密鑰/密鑰對和相同的比較邏輯。

+0

仍然是同樣的問題:/ – Chie

+0

1)你修正的代碼是什麼樣的? 2)也許你在構建樹的代碼中犯了同樣的錯誤! –

+0

我已經張貼的答案,因爲我們不能發表長註釋 – Chie