편집 : 아래는 일반적인 하위 트리 삭제를위한 것입니다. 필요한 것은 실제 질문 내용에 기초한 단일 Split
작업입니다.
최악의 경우 O(log n)
시간에 레드 - 블랙 트리의 전체 하위 트리를 삭제할 수 있습니다.
적갈색 트리에서 Split
및 Join
작업이 O(log n)
시간에 수행 될 수 있음이 알려져 있습니다.
분할 : 값 (K) 및 레드 - 블랙 트리 개의 레드 - 블랙 나무 T1으로 T 분할 T 및 T2되도록 T2에서 T1 < K의 모든 값 및 모든 값> = K 주어. T1에서 T2 (또는 T1 < 짧은 = T2)에서 < = 분 단일 레드 - 블랙 트리 T를 T1으로 두 레드 - 블랙 나무 T1 및 T2를 결합 T2가 최대 :
가입.
필요한 것은 두 개가 Splits
이고 한 개가 Join
입니다.
삭제해야 할 하위 트리가 L <= v <= U
의 값 범위에 해당합니다.
먼저 Split
을 L로 설정하면 T1이 T1 및 T2가 T1 < = T2가됩니다. Split
T3에서 T3 및 T4를 얻으려면 T2에 대해 T2 < = T4. 이제 Join
나무 T1과 T4. 의사에서
, 코드는 다음과 같이 표시됩니다 https://cstheory.stackexchange.com/questions/1045/subrange-of-a-red-and-black-tree
:
Tree DeleteSubTree(Tree tree, Tree subTree) {
Key L = subTree.Min();
Key U = subTree.Max();
Pair <Tree> splitOnL = tree.Split(L);
Pair <Tree> splitOnU = splitOnL.Right.Split(U);
Tree newTree = splitOnL.Left.Join(splitOnU.Right);
return newTree;
}
자세한 내용은이 참조