Колір бінарного дерева буде червоно-чорним деревом


16

Поширене питання інтерв'ю полягає в тому, щоб дати алгоритм визначення того, чи задане бінарне дерево збалансоване по висоті (визначення дерева AVL).

Мені було цікаво, чи можемо ми зробити щось подібне з червоно-чорними деревами.

Враховуючи довільне незабарвлене бінарне дерево (з вузлами NULL), чи існує "швидкий" алгоритм, який може визначити, чи можемо ми пофарбувати (і знайти забарвлення) вузли Червоний / Чорний, щоб вони задовольнили всі властивості червоно-чорного дерева (визначення як у цьому питанні )?

Початкова думка полягала в тому, що ми можемо просто видалити NULL-вузли і спробувати рекурсивно перевірити, чи може дерево, що утворюється, червоно-чорне дерево, але, схоже, нікуди не дінеться.

Я здійснив (короткий) пошук в Інтернеті документів, але, здається, не знайшов жодної, що, схоже, вирішує цю проблему.

Цілком можливо, що я пропускаю щось просте.


Я впевнений, що дерево може бути червоно-чорним кольором iff для кожного вузла, найдовший шлях від нього до вузла NULL не більше ніж удвічі довший, ніж найкоротший. Це досить швидко?
Karolis Juodelė

Відповіді:


12

Якщо для кожного вузла дерева найдовший шлях від нього до листяного вузла не більше ніж удвічі довший, ніж найкоротший, дерево має червоно-чорне забарвлення.

Ось алгоритм для визначення кольору будь-якого вузла 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

Ось n.black-quotaкількість чорних вузлів, які ви очікуєте побачити, переходячи до листочка, від вузла, nі n.min-heightце відстань до найближчого аркуша.

Для стислості позначення нехай , h ( n ) = і m ( n ) = .б(н)= n.black-quotaгод(н)= n.heightм(н)= n.min-height

Теорема: Фікс бінарного дерева . Якщо для кожного вузла n T , h ( n ) 2 м ( n ) і для вузла r = корінь ( T ) , b ( r ) [ 1ТнТгод(н)2м(н)r=корінь(Т)тодіTмає червоно-чорне забарвлення з точноб(r)чорними вузлами на кожному шляху від кореня до листя.b(r)[12h(r),m(r)]Tb(r)

Доведення: індукція над .b(n)

Перевірте, що всі чотири дерева висотою одне чи два задовольняють теоремі з .b(n)=1

За визначенням червоно-чорного дерева, корінь чорний. Нехай - вузол із чорним батьківським p таким, що b ( p ) [ 1np. Тодіb(n)=b(p)-1,h(n)=h(p)-1іh(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

Припустимо, теорема справедлива для всіх дерев з коренем , b ( r ) < b ( q ) .rb(r)<b(q)

Якщо , то n може бути червоно-чорним кольором за індуктивним припущенням.b(n)=m(n)n

Якщо тоb(n)=1b(p)=12h(p). nне задовольняє індуктивне припущення і тому повинно бути червоним. НехайĈбути дитиноюп. h(c)=h(p)-2і b(c)=b(p)-1=1b(n)=12h(n)1ncnh(c)=h(p)2. Тодіcможе бути червоно-чорним кольором за індуктивним припущенням.b(c)=b(p)1=12h(p)1=12h(c)c

Зауважимо, що тим самим міркуванням, якщо , тоді іn,і дитинаnвідповідають задоволенню індуктивного припущення. Томуnможе мати будь-який колір.b(n)(12h(r),m(r))nnn


@Aryabhata, будь-яке обхід добре, доки батько бачить перед своїми дітьми. У мене немає офіційного підтвердження, але я маю уявлення про те, як це виглядатиме. Я спробую щось написати, коли зможу.
Karolis Juodelė

@Aryabhata, я додав доказ. Вибач, що я так довго зайняв
Karolis Juodelė

@Aryabhata, ідея полягає в тому, що якщо деякого вузла p витримує певні межі, дитина або онук c з p можуть мати b ( c ) в цих же межах. Наявність b ( n ) у цих межах може відповідати n - чорному. Більшість доказів стосується обмеження h і m дитини чи онука, наданих h і m батьків чи дідуся та бабусі. Ваше дерево, безумовно, кольорове. б ( р о о тb(p)pcpb(c)b(n)nhmhm , ліва дитина - чорна, а права дитина - червона, шлях довжиною 16 - це b r b r b r , шлях довжиною 8 - b b b b b b b b , шляхи 9 і 12 можуть мати кілька дійсних забарвлень. b(root)=8brbrbrbbbbbbbb
Karolis Juodelė


2

Я вважаю, що відповідь Кароліс правильна (і досить приємна характеристика червоно-чорних дерев, даючи час алгоритм), просто хотіла додати ще одну можливу відповідь.O(n)

Один із підходів полягає у використанні динамічного програмування.

З огляду на дерево, для кожного вузла ви побудуєте два набори: S R ( n ) і S B ( n ), який містить можливі чорні висоти для нижнього дерева, вкоріненого в n . S R ( n ) містить чорні висоти, якщо n пофарбовано у червоний колір, а S B ( n ), якщо n пофарбовано у чорний колір.nSR(n)SB(n)nSR(n)nSB(n)n

Тепер задано множини для і н . R i g h t (тобто прямі діти n ), ми можемо обчислити відповідні множини для n , провівши відповідні перетини та об'єднання (і збільшуючи за необхідності).n.Leftn.Rightnn

Я вважаю, що це алгоритм часу .O(nlogn)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.