Pokoloruj drzewo binarne, aby było czerwono-czarnym drzewem


16

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.


Jestem prawie pewien, że drzewo może mieć kolor czerwono-czarny iff dla każdego węzła, najdłuższa ścieżka od niego do węzła NULL jest nie więcej niż dwa razy dłuższa niż najkrótsza. Czy to wystarczająco szybko?
Karolis Juodelė,

Odpowiedzi:


12

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

if n is root,
    n.color = black
    n.black-quota = height n / 2, rounded up.

else if n.parent is red,
    n.color = black
    n.black-quota = n.parent.black-quota.

else (n.parent is black)
    if n.min-height < n.parent.black-quota, then
        error "shortest path was too short"
    else if n.min-height = n.parent.black-quota then
        n.color = black
    else (n.min-height > n.parent.black-quota)
        n.color = red
    either way,
        n.black-quota = n.parent.black-quota - 1

Oto n.black-quotaliczba czarnych węzłów, których oczekujesz, że dojdą do liścia, od węzła, ni n.min-heightodległość do najbliższego liścia.

Dla zwięzłości zapisu niech , h ( n ) = i m ( n ) = .b(n)= n.black-quotah(n)= n.heightm(n)= 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 ) [ 1TnT.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)]Tb(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 ) [ 1np. 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)1h(n)=h(p)1h(n)m(n)m(p)1

Załóżmy, że twierdzenie to obowiązuje dla wszystkich drzew o korzeniu , b ( r ) < b ( q ) .rb(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)1ncnh(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))nnn


@Aryabhata, każde przejście jest w porządku, o ile rodzic jest widziany przed dziećmi. Nie mam formalnego dowodu, ale mam pojęcie, jak by to wyglądało. Spróbuję coś napisać, kiedy będę mógł.
Karolis Juodelė

@Aryabhata, dodałem dowód. Przepraszam, że zajęło mi to tak długo.
Karolis Juodelė

@Aryabhata, chodzi o to, że jeśli jakiegoś węzła p ma określone granice, dziecko lub wnuk c z p może mieć b ( c ) w tych samych granicach. Posiadanie b ( n ) w tych granicach może odpowiadać n będącemu czarnemu. Większość dowodów dotyczy ograniczenia h i m dziecka lub wnuka, biorąc pod uwagę h ) = 8 , lewe dziecko jest czarne, a prawe dziecko jest czerwone, ścieżka o długości 16 to b r b r bb(p)pcpb(c)b(n)nhmh oraz rodzica lub dziadka. Twoje drzewo z pewnością można pokolorować. b ( r o o tmb(root)=8 ścieżka o długości 8 to bb b b b b b b b , ścieżki 9 i 12 mogą mieć wiele prawidłowych kolorów.brbrbrbbbbbbbb
Karolis Juodelė


2

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.nSR(n)SB(n)nSR(n)nSB(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.Leftn.Rightnn

Wydaje mi się, że jest to algorytm czasu .O(nlogn)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.