2013-12-16 6 views
3

У меня есть двоичное дерево поиска, и я хочу удалить узел.Как вернуть ничего из функции, возвращающей значение?

мне нужно, чтобы получить его родителей, так что я написал функцию:

private BSTreeNode<T> getParent(BSTreeNode<T> root, BSTreeNode<T> node) { 
     if(root == null) 
      return null; 
     if(node.element().lessThan(root.element())) { 
      if(root.getLeft() != null && root.getLeft().element().equal(node.element())) 
       return root; 
      else 
       getParent(root.getLeft(), node); 
     } else { 
      if(root.getRight() != null && root.getRight().element().equal(node.element())) 
       return root; 
      else 
       getParent(root.getRight(), node); 
     } 
    } 

В отличие от C/C++, Java дает мне следующее сообщение об ошибке:

This method must return a result of type BSTreeNode<T> 

Это заставляет меня возвращать значение в последней строке функции.

Как исправить это в контексте моей функции?

+7

Использовать 'return getParent ...' –

+0

@SotiriosDelimanolis и использовать какие параметры? – Billie

+0

Я не знаю, это часть вашего дизайна. Дело в том, что ваш метод всегда должен возвращать что-то, если ваш тип возврата отличается от 'void'. –

ответ

3

Ваша функция не имеет возврата для каждого возможного обстоятельства. У вас есть:

if (null)... 

if (less than root)... 
else (if ...) 
     else (no return!) 

Что вы возвращаете, если оно не является нулевым, и подходит к финалу? Ничего не возвращается.

В инструкции else вы можете либо return getParent.... или return null в конце функции (не в операторе if или else)

Я часто вижу код, подобный этому, чтобы не охватывать событие, если оператор, возвращающий значение.

public int getAnswer() 
{ 
    if (answer.equals("yes")) 
     return 0; 
    else if (answer.equals("no")) 
     return 1; 

    return null; 
} 
+0

Это правильно. Вы должны иметь возврат в каждой ветви ваших if/else-заявлений. – Christine

2

Вы должны быть хорошо с этим:

private BSTreeNode<T> getParent(BSTreeNode<T> root, BSTreeNode<T> node) { 
    if(root == null) 
     return null; 
    if(node.element().lessThan(root.element())) { 
     if(root.getLeft() != null && root.getLeft().element().equal(node.element())) 
      return root; 
     else 
      return getParent(root.getLeft(), node); 
    } else { 
     if(root.getRight() != null && root.getRight().element().equal(node.element())) 
      return root; 
     else 
      return getParent(root.getRight(), node); 
    } 
} 
-1

Добавить отзыв null; в конце метода. Я думаю, что это утверждение будет недостижимым в обычных случаях, но добавьте его, чтобы исправить ошибку компиляции и попробовать, что произойдет.

private BSTreeNode<T> getParent(BSTreeNode<T> root, BSTreeNode<T> node) { 
     if(root == null) 
      return null; 
     if(node.element().lessThan(root.element())) { 
      if(root.getLeft() != null && root.getLeft().element().equal(node.element())) 
       return root; 
      else 
       getParent(root.getLeft(), node); 
     } else { 
      if(root.getRight() != null && root.getRight().element().equal(node.element())) 
       return root; 
      else 
       getParent(root.getRight(), node); 
     } 
return null; 
    } 
+0

Он всегда возвращает 'null'. – Billie

+1

Нет человека. Проверьте, что оператор возврата будет выполняться только в том случае, если все условия не работают, и это явно то же, что и ответ, который вы поддержали выше. Поэтому, пожалуйста, удалите проголосовавший голос :) –

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