Как бы вы реализовали в Java класс узлов двоичного дерева и класс двоичного дерева для поддержки наиболее эффективного (с точки зрения времени выполнения) метода одинаковой проверки (также должен быть реализован):
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 массивов и маскирование одного за другим с помощью логического AND. Мне не удалось заставить мой код работать, поэтому я не публикую его здесь (я был бы признателен за реализацию второй идеи, а также за ваши улучшения).
Есть мысли, как наиболее эффективно провести тест на равенство для бинарных деревьев?
EDIT
Вопрос предполагает структурное равенство. (Не семантическое равенство)
Однако код, который проверяет семантическое равенство, например «Должны ли мы считать два дерева равными, если их содержимое идентично, даже если их структура не одинакова?» Будет просто перебирать дерево по порядку, и это должно быть просто.