Próbuję wymyślić algorytm do usuwania duplikatów z drzewa binarnego drzewa / binarnego wyszukiwania. Jak dotąd najlepsze, co mogłem wymyślić, było
Przechowuj kratkę drzewa w tablicy w trybie Inorder.
Jeśli drzewo nie ma porządku, posortuj tablicę.
usuń duplikaty z tablicy i zrekonstruuj drzewo binarne.
Czy musimy również przechować przedtrawowe drzewo, aby zrekonstruować drzewo?
To stawia złożoność na O(n log n )
czas i O(n)
przestrzeń. Czy możemy zrobić lepiej? Pseudo-kodowe / kodowe próbki będą docenione
EDYCJA 1: Przyjmijmy, że struktura drzewa binarnego jest podana przez następujący obiekt
public class Node
{
int data;
Node right;
Node left;
// getters and setters for the left and right nodes
}
Odpowiedzi:
2 dla odpowiedzi № 1Usuń zduplikowany algorytm dla drzewa wyszukiwania binarnego:
Rozpocznij spacer po drzewie (w / przed / po zamówieniu)
W każdym węźle wykonaj wyszukiwanie binarne na poddrzewie zakorzenionym w tym węźle dla wartości klucza przechowywanej w węźle.
Jeśli klucz znajduje się w drzewie, wywołaj delete (klucz) i zrestartuj krok 2 (może mieć wiele duplikatów).
Powtarzaj krok 2, aż klucz nie zostanie znaleziony w podsieci. Następnie wróć do kroku 1
Złożoność czasu - O(nlogn)
(Dla każdego z n
elementy wykonują binarne wyszukiwanie, które trwa logn
czas)
Złożoność przestrzeni - O(logn)
(dla przestrzeni stosu używanej w rekursji)
0 dla odpowiedzi nr 2
Mam dziwny pomysł:
Jeśli masz już drzewo z duplikatami i potrzebujesz zbudować nowe bez duplikatów, możesz po prostu:
- Utwórz pustą mieszankę wartości węzłów
- Utwórz nowe drzewo
- Przechyl istniejące drzewo w dowolnej kolejności i pobieraj elementy jeden po drugim
- Jeśli element jest już obecny w mapie mieszania, nie dodawaj go do nowego drzewo
Czy to jest w porządku?)
0 dla odpowiedzi № 3
Proponowane rozwiązanie rekurencyjne dla Twojego problemu: -
deleteDup(Node p) {
if(p == NULL) return
else {
deleteDup(p.left)
deleteDup(p.right)
delete(p.value,p.left)
delete(p.value,p.right)
}
}
deleteDup(root)
Złożoność czasu:
Usunięcie w BST = O(logN)
T(N) = 2T(N/2) + O(logN)
T(N) = O(N)
Złożoność przestrzeni: O(logN)
Uwaga:- Zakładając zrównoważony BST
0 dla odpowiedzi nr 4
Miałem inny pomysł, który działa w przestrzeni O (n) i O (n). Na przykład mamy drzewo z korzeniem A i dwoje dzieci A i B. ZA A B
- Utwórz liczniki Map, które mapują każdą wartość w drzewie na liczbę.
- Przetestuj wszystkie elementy w drzewie, aby zaliczyć liczbę. Otrzymamy zliczenia [A] = 2 i liczymy [B] = 1. Zajmuje to przestrzeń O (n) i czas O (n).
- Ponownie przechodź przez wszystkie elementy w drzewie. Dla każdego elementu sprawdź, czy liczy [element]> 1, a jeśli tak, ustawiamy counts [element] -, i usuwamy ten element (używając drzewa binarnego do usunięcia / rotacji). To jest czas O (n).
- Po zakończeniu drzewo nie ma już duplikatów!
-1 dla odpowiedzi № 5
Sztuczka w tej sytuacji polega na tym, aby nie przechowywać duplikatów na początek ....
Po dodaniu węzłów do drzewa, dlaczego nie można podjąć decyzji o dodaniu węzła, jeśli ma on już duplikat w drzewie?