2015-09-27 5 views
0

У меня есть это назначение для BST, где я должен найти ближайший узел к данному. Очевидно, что если узел находится в дереве, он будет возвращен. В противном случае узел, который должен быть возвращен, является тем, который ближе всего к дереву (он может быть с обеих сторон).Функция Java продолжается после утверждения возврата

Скрипт отлично работает, за исключением ситуации, когда узел присутствует. Вместо того, чтобы возвращать узел, функция продолжает двигаться и выплевывает другой узел вместо того, чтобы убивать функцию. Мне было интересно, сможет ли кто-нибудь помочь мне.

Дерево структурирована так:

  • Он состоит из узлов
  • Каждый узел имеет «запись» (строка значения), «право» и «слева»

Вот что у меня есть, спасибо!

public Entry getClosestEntry(String w) { 
      if (root == null) return null; 
      else if (root.left == null && root.right == null) return root.entry; 
      else return getClosestEntry(w, root, null, null, null); 
    } 
    private Entry getClosestEntry(String w, Node baseNode, Node highestLow, Node lowestHi, Node finalClosest) { 
     System.out.println("Dict: " + this); 
     System.out.println("Top string to compare: " + w); 
     System.out.println("Top baseNode: " + baseNode.entry.word); 
     if (w.compareTo(baseNode.entry.word) == 0) { 
      System.out.println("Top finalClosest is baseNode: " + baseNode.entry.word); 
      finalClosest = baseNode; 
     } else { 
      if (highestLow != null) System.out.println("Top highestLow: " + highestLow.entry.word); 
      else System.out.println("Top highestLow is null"); 
      if (lowestHi != null) System.out.println("Top lowestHi: " + lowestHi.entry.word); 
      else System.out.println("Top lowestHi is null"); 
      if (finalClosest != null) System.out.println("Top finalClosest: " + finalClosest.entry.word); 
      else System.out.println("Top finalClosest is null"); 

      int cmp = w.compareTo(baseNode.entry.word); 

      if (cmp < 0) { 
       System.out.println("Word is less than base."); 
       if (lowestHi == null) { 
        lowestHi = baseNode; 
        System.out.println("lowestHi set to: " + lowestHi.entry.word); 
       } 
       else { 
        if (w.compareTo(lowestHi.entry.word) < 0 && baseNode.entry.word.compareTo(lowestHi.entry.word) < 0) { 
         lowestHi = baseNode; 
         System.out.println("lowestHi changed to: " + lowestHi.entry.word); 
        } 
       } 
       System.out.println("Returning right side of base."); 
       if (baseNode.right != null) getClosestEntry(w, baseNode.right, highestLow, lowestHi, finalClosest); 
      } else { 
       System.out.println("Word is greater than base."); 
       if (highestLow == null) { 
        highestLow = baseNode; 
        System.out.println("highestLow set to: " + highestLow.entry.word); 
       } 
       else { 
        if (w.compareTo(highestLow.entry.word) > 0 && baseNode.entry.word.compareTo(highestLow.entry.word) > 0) { 
         highestLow = baseNode; 
         System.out.println("highestLow changed to: " + highestLow.entry.word); 
        } 
       } 
       System.out.println("Returning left side of base."); 
       if (baseNode.left != null) getClosestEntry(w, baseNode.left, highestLow, lowestHi, finalClosest); 
      } 

      if (lowestHi == null && highestLow != null && finalClosest == null) { 
       System.out.println("lowestHi is null, so finalClosest must be highestLow."); 
       finalClosest = highestLow; 
      } else if (highestLow == null && lowestHi != null && finalClosest == null) { 
       System.out.println("highestLow is null, so finalClosest must be lowestHi."); 
       finalClosest = lowestHi; 
      } else if (lowestHi == null && highestLow == null && finalClosest == null) { 
       System.out.println("Both sides are null, so node must be null."); 
       return null; 
      } else { 
       System.out.println("Both sides are there. Default to highestLow if finalClosest is null"); 
       if (finalClosest == null) finalClosest = highestLow; 
      } 
     } 
     System.out.println("Final Closest: " + finalClosest.entry.word); 
     return finalClosest.entry; 
    } 
+1

'if (...) return getClosestEntry (...);', а не 'if (...) getClosestEntry (...);' – Dukeling

+0

@ Dukeling Я был на той дороге ... то же самое. –

+1

@ClaytonAndrewCohn В этом случае строка может быть удалена, так как результат не используется нигде. например, 'if (baseNode.left! = null) getClosestEntry (w, baseNode.left, maximumLow, lowerHi, finalClosest);' будет просто мертвым кодом, так как результатом является 'return finalClosest.entry;' и рекурсивный вызов не мутирует любые значения. – Sylwester

ответ

0

Исправлено. Раньше я забывал рассмотреть некоторые сценарии.

Смежные вопросы