2016-04-30 3 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; 

это только возвращает р, если оба они истинны. Попробуйте изменить && на ||. Поскольку это 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