도구스개발

스플레이 트리 회전 계산기

찾은 키를 회전으로 뿌리까지 끌어올리는 과정을 zig·zig-zig·zig-zag로 나눠 그림으로 보여 줍니다. zig-zig의 회전 순서를 바꾸면 높이가 어떻게 달라지는지도 함께 냅니다.

쉼표·공백으로 구분 — 현재 8개 (중복은 한 번만)

35을(를) 뿌리로 끌어올리기

회전 3번

깊이 3 → 0 · 트리 높이 4 → 4층

탐색 경로50 → 30 → 40 → 35
비교 횟수 (경로 길이)4
회전 횟수3
단계 수 (zig · zig-zig · zig-zag)1 · 0 · 1
중위 순회가 매 단계 정렬 순서였는가예 — 모든 단계에서
5030702040608035

높이 4층

회전 과정

1. zig-zag — 방향이 엇갈린다. 노드를 두 번 돌린다

노드 35 · 부모 40 · 조부모 30 · 깊이 31 · 높이 4

5035703040608020

2. zig — 부모가 뿌리라 한 번만 돌린다

노드 35 · 부모 50 · 깊이 10 · 높이 4

3530502040706080
3530502040706080

높이 4층 · 뿌리가 35

zig-zig를 zig 두 번으로 바꾸면 회전 수는 3번으로 같은데 트리 높이가 4층이 아니라 4층이 됩니다. zig-zig에서는 조부모를 «먼저» 돌려야 노드 아래 매달려 있던 부분트리가 경로의 양쪽으로 갈라져 붙습니다. 한 줄이던 것이 두 갈래가 되면서 깊이가 접히는 것입니다. 노드만 두 번 위로 빼면 나머지는 그대로 한 줄에 남아, 다음 접근도 여전히 비쌉니다. 순서 하나가 분할상환 보장을 가르는 자리입니다.
어떤 회전을 몇 번 하든 중위 순회는 언제나 같은 정렬 순서여야 합니다. 회전은 이진탐색트리의 성질을 건드리지 않기 때문이며, 구현이 맞는지 보는 첫 검사가 이것입니다. 위 «회전 과정»의 각 그림을 왼쪽부터 읽으면 매번 같은 순서인 것을 눈으로 확인할 수 있습니다.
스플레이 트리는 균형을 보장하지 않습니다 — 분할상환으로만 O(log n)입니다. AVL이나 레드-블랙 트리는 매번 균형을 재서 바로잡고 노드마다 균형 정보를 들고 다닙니다. 스플레이 트리는 그런 것을 하나도 갖지 않는 대신, 한 번의 접근이 O(n)이 될 수 있어도 m번의 접근이 모두 합쳐서 O(m log n)이 됩니다. 최악의 한 번이 아니라 전체를 견주는 이야기입니다. 한 줄로 늘어선 키(예: 10, 9, 8, …, 1)를 넣고 1을 찾아 보면 그 차이가 보입니다.
삭제는 다루지 않습니다. 찾은 노드를 뿌리로 올린 뒤 두 부분트리를 합치는 별도 연산이라 회전 이야기와 섞이기 때문입니다. 키는 40개까지 받으며, 원래 스플레이 트리는 삽입·탐색 때 모두 스플레이하지만 회전 과정을 보이려면 흔한 이진탐색트리 모양에서 출발하는 편이 나아 삽입 방식을 고를 수 있게 했습니다.

사용 방법

  1. 1넣을 키를 쉼표로 구분해 적습니다. 중복은 한 번만 들어갑니다.
  2. 2찾아서 끌어올릴 키를 정합니다.
  3. 3회전 과정의 각 단계를 그림으로 확인합니다. zig·zig-zig·zig-zag가 구분되어 나옵니다.
  4. 4한 줄로 늘어선 키(10, 9, 8, …, 1)를 넣고 1을 찾아 보면 높이가 접히는 것을 볼 수 있습니다.

자주 묻는 질문

찾은 노드를 회전으로 뿌리까지 끌어올립니다. 노드 x, 부모 p, 조부모 g라 할 때 p가 뿌리면 zig(한 번 회전), x와 p의 방향이 같으면 zig-zig, 다르면 zig-zag로 나눠 두 번씩 회전합니다. 균형을 재거나 노드마다 균형 정보를 들고 다니는 일은 하지 않습니다.

조부모를 «먼저» 돌려야 하며, 노드를 두 번 올리는 것으로 바꾸면 분할상환 보장이 깨집니다. 조부모 먼저 돌리면 노드 아래 매달려 있던 부분트리가 경로의 양쪽으로 갈라져 붙어 깊이가 접히지만, 노드만 두 번 위로 빼면 나머지는 그대로 한 줄에 남습니다. 노드 16개가 한 줄로 늘어선 트리에서 가장 깊은 노드를 끌어올리면 제대로 한 쪽은 높이가 16에서 10으로 줄고, 노드를 두 번 올리는 쪽은 회전 수가 같은데도 16 그대로입니다.

그쪽은 균형을 «유지»하고 스플레이 트리는 균형을 보장하지 않습니다. 한 줄로 늘어선 트리가 얼마든지 나올 수 있어 한 번의 접근이 O(n)이 될 수 있습니다. 대신 m번의 접근이 모두 합쳐서 O(m log n)이 되는데, 이것이 분할상환 보장이며 최악의 한 번이 아니라 전체를 견주는 이야기입니다. 균형 정보를 저장하지 않아도 된다는 것과 최근에 쓴 것이 위로 올라온다는 것이 얻는 쪽입니다.

중위 순회가 언제나 같은 정렬 순서인지로 봅니다. 회전은 이진탐색트리의 성질을 건드리지 않으므로 어떤 회전을 몇 번 하든 중위 순회 결과가 달라지면 안 됩니다. 이 계산기는 매 단계마다 그것을 확인해 결과에 표시합니다.

실제 접근이 고르게 흩어지지 않고 몰리는 경우가 많기 때문입니다. 방금 쓴 것을 곧 다시 쓸 가능성이 높으면 그것을 뿌리에 두는 편이 유리하고, 스플레이 트리는 그 습성을 자료구조 자체에 담습니다. 접근 분포가 치우칠수록 이득이 커지고, 완전히 고르게 흩어지면 균형 트리와 비슷해집니다.

이 계산기는 트리를 그대로 둡니다. 실제 스플레이 트리는 탐색이 멈춘 마지막 노드를 대신 끌어올리는데, 다음에 그 근처를 다시 찾을 가능성이 높기 때문입니다. 여기서는 회전 과정을 보이는 것이 목적이라 그 규칙을 넣지 않았습니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 키는 이 기기에만 남습니다.

알아두면 좋은 점

  • 삭제는 다루지 않습니다. 찾은 노드를 뿌리로 올린 뒤 두 부분트리를 합치는 별도 연산이라 회전 이야기와 섞입니다.
  • 없는 키를 찾을 때 마지막으로 지난 노드를 끌어올리는 실제 규칙은 넣지 않았습니다. 트리를 그대로 둡니다.
  • 원래 스플레이 트리는 삽입할 때도 스플레이합니다. 회전 과정을 보이려면 흔한 이진탐색트리 모양에서 출발하는 편이 나아 삽입 방식을 고를 수 있게 했습니다.
  • 키는 40개까지 받습니다. 그림이 가로로 늘어나 읽기 어려워지기 때문입니다.
  • 균형을 보장하지 않습니다. 한 번의 접근은 O(n)이 될 수 있고 O(log n)은 분할상환 값입니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.