Как реализовать в Java класс двоичного дерева node и двоичный древовидный класс для поддержки наиболее эффективного (с точки зрения времени выполнения) равного метода проверки (также должен быть реализован):
boolean equal(Node<T> root1, Node<T> root2) {}
или
boolean equal(Tree t1, Tree t2) {}
Сначала я создал класс node следующим образом:
public class Node<T> {
private Node<T> left;
private Node<T> right;
private T data;
// standard getters and setters
}
а затем метод equals, который принимает 2 корневых узла в качестве аргументов и выполняет стандартное рекурсивное сравнение:
public boolean equals(Node<T> root1, Node<T> root2) {
boolean rootEqual = false;
boolean lEqual = false;
boolean rEqual = false;
if (root1 != null && root2 != null) {
rootEqual = root1.getData().equals(root2.getData());
if (root1.getLeft()!=null && root2.getLeft() != null) {
// compare the left
lEqual = equals(root1.getLeft(), root2.getLeft());
}
else if (root1.getLeft() == null && root2.getLeft() == null) {
lEqual = true;
}
if (root1.getRight() != null && root2.getRight() != null) {
// compare the right
rEqual = equals(root1.getRight(), root2.getRight());
}
else if (root1.getRight() == null && root2.getRight() == null) {
rEqual = true;
}
return (rootEqual && lEqual && rEqual);
}
return false;
}
Моя вторая попытка состояла в том, чтобы использовать деревья, используя массивы и индексы для перемещения. Затем сравнение может быть выполнено с помощью побитовых операций (AND) на двух массивах - прочитайте фрагмент из 2 массивов и замаскируйте один за другим с помощью логического И. Мне не удалось заставить мой код работать, поэтому я не размещаю его здесь (я был бы признателен за реализацию второй идеи, а также за ваши улучшения).
Любые мысли о том, как наиболее эффективно выполнять тест равенства для бинарных деревьев?
ИЗМЕНИТЬ
Вопрос предполагает структурное равенство. (Не семантическое равенство)
Однако код, который проверяет семантическое равенство, например. "Должны ли мы считать, что два дерева равны, если их содержимое идентично, даже если их структура не является?" Было бы просто перебирать дерево по порядку, и оно должно быть простым.