균형 이진 검색 트리는 O (log n) 조회 (또는 유사한 작업) 를 보장하는 데 필수적 입니다. 많은 키가 무작위로 삽입 및 / 또는 삭제되는 동적 환경에서 트리는 조회하기에 끔찍한 연결된 목록으로 생성 될 수 있습니다. 따라서이 효과를 막는 다양한 종류의 자체 균형 이진 트리 가 있습니다 (예 : AVL 트리 또는 splay 트리 ). 이 나무는 나무의 균형을 재조정 하는 여러 종류의 회전 을 기반으로 합니다.
회전
이 과제에서는 단일 오른쪽 회전 만 살펴볼 것입니다. 이러한 회전 (왼쪽 회전은 대칭이 됨)은 다음과 같습니다.
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
나뭇잎 1
이 4
있거나 6
왼쪽 또는 오른쪽 하위 트리가있는 경우 회전은 단순히 해당 트리를 유지합니다. 이것이 더 큰 나무의 하위 트리 인 경우 노드에서 간단히 "잘라 내고" 5
회전 된 트리 (현재 노드 3
)를 해당 노드에 "재 부착" 합니다.
도전
이진 검색 트리 1 과 키가 위에서 설명한 것처럼 해당 노드에서 트리를 오른쪽으로 회전시킵니다. 위 예에서 제공된 키는입니다 5
.
규칙 및 I / O
- 선택한 키와 테스트 케이스의 키가 서로 다른 한 키에 대해 모든 유형을 사용할 수 있습니다.
- 모호성이없고 (예를 들어
[3,[]]
달리 명시되지 않는 한 모호한 경우) 이진 트리에 대한 표현을 선택할 수 있으며 선택한 언어에 적합합니다. - 입력은 항상 이진 검색 트리이므로 중복 키가 없습니다.
- 키가 트리에 포함되어 있다고 가정 할 수 있습니다
- 키를 포함하는 노드에 왼쪽 자식이 있다고 가정 할 수 있습니다
- 제공된 키 아래에 올바른 하위 트리를 가정 할 수 없습니다
- 당신은 회전하기 전에 나무가 불균형하다고 가정 하지 않을 수 있습니다
- 당신은 회전 후 나무가 균형이 있다고 가정 하지 않을 수 있습니다
- 기본 I / O 방법을 사용할 수 있습니다
- 제출물은 트리를 반환하는 함수이거나 솔루션을 인쇄하는 전체 프로그램 일 수 있습니다.
테스트 사례
이 예제는 다음과 같이 트리를 나타냅니다.
- 그것이 잎이라면 :
[]
- 키가있는 트리
x
이고 두 하위 트리가 모두 잎 인 경우 :[x]
- 키
x
와 하위 트리가있는 트리 인 경우left
right
:[x,left,right]
첫 번째 예는 회전 섹션에 제공된 예입니다 . 어떤 이유로 당신이 그들의 그래픽 표현을해야하는 경우, 여기에 2 당신은 간다.
5 [5,[3,[1],[4]],[6]] -> [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]] -> [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]] -> [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]] -> [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]] -> [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]] -> [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]] -> [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
1 : 모든 노드에서 왼쪽 하위 트리의 모든 키가 해당 키보다 작고 오른쪽 하위 트리의 모든 키가 그보다 큰 것을 의미
2 : 링크 로트를 방지하기 위해 주석으로 포함 시켰습니다.
data B=B[B]Int
더 많은 바이트가 절약됩니다.