Итак, я хочу войти в свое дерево (которое, как предполагается, не имеет дубликатов и правильно разветвлено) и найти элемент, заданный в параметрах. Я обнаружил, что мой метод дает мне 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.
_ "Я знаю это, потому что корневое поле (член дерева) - это то, что я искал, и оно не равно найденному элементу, хотя все поля имеют одинаковые значения." _ Не могли бы вы показать нам небольшой пример, демонстрирующий проблему? И вы переопределили метод 'equals' в классе вашего объекта, который имеет ваше дерево? –
Я забыл добавить, что я охотился за информацией об этом, но мой вопрос кажется слишком конкретным. Я думаю, что ошибка небольшая и что я просто пропускаю что-то очевидное. – shane
В настоящее время это не удастся для любого не идеально сбалансированного дерева - вам нужно проверить, является ли 'start' нулевым или рекурсивно вызывать' findElementNode' для детей, существовать. Кроме этого, это выглядит хорошо - короткий, но * полный * пример был бы полезен. Даже не понятно, что вы имеете в виду в описании того, что не так ... –