Jak zaimplementować w Javie klasę węzła drzewa binarnego i klasę drzewa binarnego w celu obsługi najbardziej wydajnej (z perspektywy czasu wykonywania) metody równego sprawdzania (również musi być wdrożone):Najbardziej efektywny sposób testowania dwóch drzew binarnych dla równości
boolean equal(Node<T> root1, Node<T> root2) {}
lub
boolean equal(Tree t1, Tree t2) {}
Najpierw stworzyłem klasę Node następująco:
public class Node<T> {
private Node<T> left;
private Node<T> right;
private T data;
// standard getters and setters
}
i sposób dorównuje trwa 2 węzłów korzeniowych jako argumenty i działa na standardowym rekurencyjne Porównanie:
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;
}
Drugą próbę było realizować przy użyciu macierzy drzewa i indeksy do przechodzenia. Następnie porównanie można wykonać za pomocą operacji bitowych (AND) na dwóch tablicach - odczytaj fragment z 2 tablic i zamaskuj jeden za drugim, używając logicznego AND. Nie udało mi się uruchomić mojego kodu, więc nie zamieszczam go tutaj (byłbym wdzięczny za implementację drugiego pomysłu i ulepszeń).
Jakieś przemyślenia, jak wykonać test równości drzew binarnych najefektywniej?
EDIT
Pytanie zakłada równość strukturalny. (Nie semantyczna równość)
Jednak kod testujący równość semantyczną, np. "Czy powinniśmy uznać te dwa drzewa za równe, jeśli ich zawartość jest identyczna, nawet jeśli ich struktura nie jest?" Po prostu będzie to powtarzanie po drzewie w kolejności i powinno być proste.
„Jeżeli weźmiemy pod uwagę ...” sugeruje, subiektywną opinię i wykonując tak nie nadaje się do tych pytań [może zostać zamknięta, ponieważ „nie konstruktywne”] . Powinieneś zdefiniować, który to jest: równość strukturalną lub równość semantyczną, której szukasz. [przynajmniej IMO] – amit
@amit, uzgodnione. zobacz moją edycję – aviad