二分木の色を赤黒木にする


16

一般的なインタビューの質問は、特定のバイナリツリーが高さのバランスが取れているかどうかを判断するアルゴリズムを提供することです(AVLツリー定義)。

赤黒木で似たようなことができるのかと思っていました。

任意の未着色のバイナリツリー(NULLノード)が与えられた場合、ノードが赤黒ツリーのすべてのプロパティを満足するようにノードを赤/黒に色付けできるかどうかを判断できる「高速」アルゴリズムがあります。 (この質問のような定義)?

最初の考えは、NULLノードを削除して、結果のツリーが赤黒ツリーになり得るかどうかを再帰的に検証しようとすることでしたが、それはどこにも行かないようでした。

私は論文を(簡単に)ウェブ検索しましたが、この問題に対処していると思われるものを見つけることができませんでした。

単純なものが欠けている可能性があります。


私はかなり確信して木が赤黒色可能だIFF各ノードに対して、NULLノードへそれから最長パスはもう二度長い最短のものよりもよりません。これで十分ですか?
カロリスJuodelė13年

回答:


12

ツリーの各ノードについて、そのノードからリーフノードへの最長パスが最短ノードの2倍以下である場合、ツリーの色は赤黒になります。

これがノードの色を計算するアルゴリズムです 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あなたがノードから、葉に行く見て期待黒のノードの数であるnn.min-height最寄りの葉までの距離です。

b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height

TnTh(n)2m(n)r=root(T)b(r)[12h(r),m(r)]Tb(r)

b(n)

b(n)=1

npb(p)[12h(p),m(p)]b(n)=b(p)1h(n)=h(p)1h(n)m(n)m(p)1

rb(r)<b(q)

b(n)=m(n)n

b(p)=12h(p)b(n)=12h(n)1ncnh(c)=h(p)2b(c)=b(p)1=12h(p)1=12h(c)c

b(n)(12h(r),m(r))nnn


@Aryabhata、親が子の前にいる限り、どんなトラバーサルでも問題ありません。正式な証拠は書かれていませんが、それがどのように見えるかについてのアイデアはあります。できるときに何かを書き上げてみます。
カロリスJuodelė13年

@Aryabhata、証拠を追加しました。すみません、時間がかかりました。
カロリスJuodelė13年

b(p)pcpb(c)b(n)nhmhmb(root)=8brbrbrbbbbbbbb


2

O(n)

1つのアプローチは、動的プログラミングを使用することです。

nSR(n)SB(n)nSR(n)nSB(n)n

n.Leftn.Rightnn

O(nlogn)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.