2014-01-02 4 views
0

Итак, я хочу войти в свое дерево (которое, как предполагается, не имеет дубликатов и правильно разветвлено) и найти элемент, заданный в параметрах. Я обнаружил, что мой метод дает мне BinaryNode, который похож на то, что я хочу (корень) в его полях, но на самом деле не является корнем. Я не переопределил метод equals. Используя метод equals, тест возвращает false, когда сравниваются возвращенный объект и корень. Я хочу знать, почему моя переменная, elementNode, не ссылается (и, следовательно, изменяет), что корень имеет значение null, когда он установлен равным null.Ссылка на узел в двоичном дереве

Двоичные узлы реализованы с использованием дженериков. Этот метод вызывается с корнем в качестве отправной точки. Любая помощь будет оценена, спасибо.

/** 
* Returns the node that the sought element resides within 
* 
* @param element: The element being hunted 
* @param start: The start of the search (usually the root) 
* @return The node that the element resides in 
*/ 
private BinaryNode<T> findElementNode(T element, BinaryNode<T> start) { 


    if (start.getElement().equals(element)) { 
     return start; 
    } 

    // the element is not in the collection 
    if (start.getLeftChild() == null && start.getRightChild() == null) { 
     return null; 
    } 

    int comparison = element.compareTo(start.getElement()); 

    if (comparison < 0) { 
     return findElementNode(element, start.getLeftChild()); 
    } else { 
     return findElementNode(element, start.getRightChild()); 
    } 
} 

РЕДАКТИРОВАТЬ НАПРИМЕР: (это для способа удаления)

if (!hasLeft && !hasRight) { 

     System.out.println(elementNode + "," + root); 
     elementNode = null;   
     System.out.println(elementNode + "," + root); 

     return true; 
    } 

В этом выходы:

BinaryNode @ 68b0019f, BinaryNode @ 68b0019f и нулевой, BinaryNode @ 68b0019f

РЕДАКТИРОВАТЬ ОТВЕТ: Причина, по которой возвращаемый элемент не устанавливает узел, на который указывает, что он равен нулю, заключается в том, что в Java мы можем указывать только точки, а не редактировать их. Поэтому, чтобы сделать мой узел нулевым, я найду родителя и просто поставлю его левый/правый дочерний элемент равным null.

+0

_ "Я знаю это, потому что корневое поле (член дерева) - это то, что я искал, и оно не равно найденному элементу, хотя все поля имеют одинаковые значения." _ Не могли бы вы показать нам небольшой пример, демонстрирующий проблему? И вы переопределили метод 'equals' в классе вашего объекта, который имеет ваше дерево? –

+0

Я забыл добавить, что я охотился за информацией об этом, но мой вопрос кажется слишком конкретным. Я думаю, что ошибка небольшая и что я просто пропускаю что-то очевидное. – shane

+1

В настоящее время это не удастся для любого не идеально сбалансированного дерева - вам нужно проверить, является ли 'start' нулевым или рекурсивно вызывать' findElementNode' для детей, существовать. Кроме этого, это выглядит хорошо - короткий, но * полный * пример был бы полезен. Даже не понятно, что вы имеете в виду в описании того, что не так ... –

ответ

0

Попробуйте что-нибудь в этом роде.

private boolean findElementNode(T element, BinaryNode<T> start) { 

    if (start == null) { 
     return false; 
    } else { 
     if (element.getElement().equals(start.getElement())) { 
     return true; 
     } else { 
     int comparison = element.compareTo(start.getElement()); 

     if (comparison < 0) { 
      return findElementNode(element, start.getLeftChild()); 
     } else { 
      return findElementNode(element, start.getRightChild()); 
     }   
    } 
} 

EDIT: это на самом деле то, что вы хотите. Скажите, если это сработает.

private BinaryNode<T> findElementNode(T element, BinaryNode<T> start) { 
    if(start != null){ 
     if(start.getElement().equals(element)){ 
      return start; 
     } else { 
      BinaryNode<T> start = findElementNode(element, start.getLeftChild()); 
      if(start == null) { 
       start = findElementNode(element, start.getRightChild()); 
      } 
      return start; 
     } 
    } else { 
     return null; 
    } 
} 
+0

Прошу прощения, я немного смущен. Я хочу получить узел, содержащий элемент, который я ищу. С помощью этого метода не получится ли я просто true (элемент был найден) или false (элемент не находится в дереве)? – shane

+0

Да, моя ошибка. Я добавляю новое решение. – Vannens

+0

Ваша ошибка устраняет проблему не «равного» корню. Однако, когда я установил свой elementNode (который возвращается из вашего кода) в null, корень остается тем же, а переменная узла становится нулевой. Я не уверен, как это исправить. Так как они равны и относятся к одному и тому же пространству в памяти, не следует ли устанавливать одно значение равным нулю, а другое равно нулю? – shane

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