RedBlack [균형, 정렬] 바이너리 트리가 있고 [lower, upper] 범위 내의 모든 값을 찾으려고 검색 중입니다. 이 코드 그래서 범위 조정 BinaryTree를 검색하여 외부 요소를 가져옵니다.
public IEnumerable<TData> Range(
BinaryTree<TData> root,
IComparer<TData> comparer,
TData lower,
TData upper)
{
var stack = new Stack<State>(16);
BinaryTree<TData> here = root;
do
{
if (here == null)
{
if (stack.Count == 0)
break;
State popped = stack.Pop();
yield return popped.Data;
here = popped.Next;
continue;
}
if (comparer.Compare(here.Data, lower) < 0)
{
here = here.Right;
}
else if (comparer.Compare(here.Data, upper) > 0)
{
here = here.Left;
}
else
{
stack.Push(new State {Next = here.Right, Data = here.Data});
here = here.Left;
}
} while (true);
}
, 나는 값
[0, 1, 4, 5, 6, 9],
및
[3, 8]
나는 다음을 얻을 것입니다 범위 내의 모든 요소를 검색하여 빌드 트리를 가지고 있다면 검색 결과 :
[4, 5, 6].
제 질문은 검색의 바깥 쪽 요소를 얻기 위해이 알고리즘을 조정하는 방법입니다.
[1, 4, 5, 6, 9]
트리의 1과 4 사이의 값 3 거짓말 즉
, 그래서 유사하게 6과 9 사이의 값 (8) 거짓말과 내가 9가 될 수있는 값에 포함 할 것, 1을 반환하려면이 같은 결과.
한 캐치 내가 루트
에서 검색 현재 NGenerics 일반적인 알고리즘 대답을 받아 들일[편집]
를 사용하여 구현를 다시 시작하지 않을 것입니다.
균형 잡힌 (정렬 된) 트리입니까? 그것은 큰 차이를 만듭니다. –
예 죄송합니다, RedBlackTree –