이진 트리를 빨간색-검정색 나무로 채색


16

일반적인 인터뷰 질문은 주어진 이진 트리가 높이 균형을 이루는 지 확인하는 알고리즘을 제공하는 것입니다 (AVL 트리 정의).

Red-Black 나무와 비슷한 것을 할 수 있는지 궁금합니다.

임의의 채색되지 않은 이진 트리 (NULL 노드 포함)가 주어지면, 노드가 Red-Black 트리의 모든 속성을 만족시킬 수 있도록 Red / Black 노드를 채색 (및 채색 할 수 있는지) 여부를 결정할 수있는 "빠른"알고리즘이 있습니까? (이 질문 에서 정의 )?

초기 생각은 NULL 노드를 제거하고 결과 트리가 레드-블랙 트리가 될 수 있는지 재귀 적으로 확인하려고 시도했지만 아무데도 가지 않는 것 같습니다.

나는 논문에 대한 (간단한) 웹 검색을했지만이 문제를 다루는 것으로 보이는 것을 찾지 못했습니다.

간단한 것이 누락되었을 수 있습니다.


나는 나무가 각 노드마다 붉고 검은 색의 iff 가 될 수 있다고 확신합니다 . 충분히 빠르나요?
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당신이 노드에서, 잎에 갈 것으로 예상 검은 색 노드의 수 nn.min-height가장 가까운 잎까지의 거리입니다.

간결한 표기법을 위해 , h ( n ) =m ( n ) = 이라고하자 .b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height

정리 : 이진 트리 수정하십시오 . 모든 노드 n T , h ( n ) 2 m ( n ) 및 노드 r = 루트 ( T ) 인 경우 b ( r ) [ 1TnTh(n)2m(n)r=root(T),T는루트에서 잎까지 모든 경로에정확히b(r)검은 색 노드가있는 적-흑색을 띤다.b(r)[12h(r),m(r)]Tb(r)

증명 : 대한 유도 .b(n)

높이가 1 또는 2 인 4 개의 나무가 모두 정리를 만족하는지 확인하십시오 .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은 귀납적 가정을 만족시키지 않으므로 적색이어야합니다. 하자가c는의 자식N. h(c)=h(p)2b(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 가 특정 범위를 사용하는 경우 p 의 자식 또는 손자 c 는 동일한 범위 내에서 b ( c )를 가질 수 있습니다 . 이들 경계에 b ( n ) 을 갖는 것은 n 이 흑색 인 것에 대응할 수 있다. 대부분의 증거는 부모 나 조부모의 hm 이 주어지면 아이 또는 손자의 hm 을 경계 짓는 것 입니다. 당신의 나무는 확실히 착색 가능합니다. b ( r o o tb(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

Karolis의 대답은 정확하고 ( 시간 알고리즘을 제공하는 빨강-검정 나무의 훌륭한 특성화 ) 다른 대답을 추가하고 싶었습니다.O(n)

한 가지 방법은 동적 프로그래밍을 사용하는 것입니다.

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

n.Leftn.Right (i.e direct children of n), we can compute the corresponding sets for n, by taking appropriate intersections and unions (and incrementing as needed).

I believe this comes out be an O(nlogn) time algorithm.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.