Częstym pytaniem w rozmowie kwalifikacyjnej jest podanie algorytmu określającego, czy dane drzewo binarne ma zrównoważoną wysokość (definicja drzewa AVL).
Zastanawiałem się, czy możemy zrobić coś podobnego z czerwono-czarnymi drzewami.
Biorąc pod uwagę dowolne bezbarwne drzewo binarne (z węzłami NULL), czy istnieje „szybki” algorytm, który może określić, czy możemy pokolorować (i znaleźć kolorystykę) węzłów czerwony / czarny, aby spełniały wszystkie właściwości drzewa czerwono-czarnego (definicja jak w tym pytaniu )?
Początkowa myśl była taka, że możemy po prostu usunąć węzły NULL i spróbować rekurencyjnie zweryfikować, czy powstałe drzewo może być drzewem czerwono-czarnym, ale wydaje się, że nigdzie nie poszło.
Przeprowadziłem (krótkie) wyszukiwanie artykułów w Internecie, ale nie mogłem znaleźć żadnych, które mogłyby rozwiązać ten problem.
Możliwe, że brakuje mi czegoś prostego.
źródło
Odpowiedzi:
Jeśli dla każdego węzła drzewa najdłuższa ścieżka od niego do węzła liścia jest nie więcej niż dwa razy dłuższa niż najkrótsza, drzewo ma czerwono-czarne zabarwienie.
Oto algorytm określający kolor dowolnego węzła
n
Oto
n.black-quota
liczba czarnych węzłów, których oczekujesz, że dojdą do liścia, od węzła,n
in.min-height
odległość do najbliższego liścia.Dla zwięzłości zapisu niech , h ( n ) = i m ( n ) = .b(n)= h(n)= m(n)=
n.black-quota
n.height
n.min-height
Twierdzenie: Fix binarnego drzewa . Jeżeli dla każdego węzła n ∈ T , h ( n ) ≤ 2 m ( n ) i dla węzła r = pierwiastek ( T ) , b ( r ) ∈ [ 1T n∈T h(n)≤2m(n) r=root(T) a następnieTma czerwono-czarne zabarwienie z dokładnieb(r)czarnymi węzłami na każdej ścieżce od korzenia do liścia.b(r)∈[12h(r),m(r)] T b(r)
Dowód: indukcja powyżej .b(n)
Sprawdź, czy wszystkie cztery drzewa wysokości jednego lub dwóch spełniają twierdzenie .b(n)=1
Z definicji drzewa czerwono-czarnego korzeń jest czarny. Niech będzie węzłem z czarnym rodzicem p takim, że b ( p ) ∈ [ 1n p . Następnieb(n)=b(p)-1,h(n)=h(p)-1orazh(n)≥m(n)≥m(p)-1.b(p)∈[12h(p),m(p)] b(n)=b(p)−1 h(n)=h(p)−1 h(n)≥m(n)≥m(p)−1
Załóżmy, że twierdzenie to obowiązuje dla wszystkich drzew o korzeniu , b ( r ) < b ( q ) .r b(r)<b(q)
Jeśli , to n może być zabarwione na czerwono-czarny kolor przez założenie indukcyjne.b(n)=m(n) n
Jeśli a następnieb(n)=⌈1b(p)=12h(p) . nnie spełnia założenia indukcyjnego i dlatego musi być czerwony. Niechcbędzie dzieckiemn. h(c)=h(p)-2oraz b(c)=b(p)-1=1b(n)=⌈12h(n)⌉−1 n c n h(c)=h(p)−2 . Wtedycmoże być czerwono-czarne według założenia indukcyjnego.b(c)=b(p)−1=12h(p)−1=12h(c) c
Zauważ, że z tego samego powodu, jeżeli , a następnie zarównon,jaki dzieckonspełniają założenie indukcyjne. Dlategonmoże mieć dowolny kolor.b(n)∈(12h(r),m(r)) n n n
źródło
Uważam, że odpowiedź Karolis jest poprawna (i całkiem ładna charakterystyka czerwono-czarnych drzew, podając algorytm czasu ), po prostu chciałam dodać kolejną możliwą odpowiedź.O(n)
Jednym z podejść jest zastosowanie programowania dynamicznego.
Biorąc pod uwagę drzewo, dla każdego węzła konstruujesz dwa zestawy: S R ( n ) i S B ( n ), które zawierają możliwe czarne wysokości dla poddrzewa zakorzenionego w n . S R ( n ) zawiera czarne wysokości, zakładając, że n ma kolor czerwony, a S B ( n ) zakłada, że n ma kolor czarny.n SR(n) SB(n) n SR(n) n SB(n) n
Teraz podane zestawy dla i n . R i g h t (tj. Bezpośrednie potomki n ), możemy obliczyć odpowiednie zestawy dla n , biorąc odpowiednie skrzyżowania i związki (i zwiększając w razie potrzeby).n.Left n.Right n n
Wydaje mi się, że jest to algorytm czasu .O(nlogn)
źródło