본 포스팅은 아래의 출처를 참고하여 정리한 것입니다.
https://www.youtube.com/watch?v=PIidtIBCjEg&list=PLsMufJgu5933ZkBCHS7bQTx0bncjwi4PK&index=1
이진탐색트리: 탐색에 적합한 트리 자료구조
모든 트리에 대해 각 노드의 왼쪽 부트리는 x(부모노드)보다 작거나 같은, 오른쪽 부트리는 x보다 큰 형태를 만족해야 함
트리의 높이 라 할 때
가장 가 큰 이진탐색트리: 각 노드가 하나씩의 자식 노드만을 가질 때
반대로, 가장 가 작은 이진탐색트리: 노드마다 최대 두개씩의 자식노드를 가질 때 ➡️ heap
➡️ 즉,
트리의 높이 h가 어느정도 커진다고 생각되면, 조정을 통해 트리의 h를 항상 으로 유지하는 이진 탐색트리를 생각 ➡️ 균형이진탐색트리 (Balanced BST)
x가 올라오면서 z는 x의 오른쪽 child가 되고, x에는 왼쪽 child 자리밖에 없으므로 원래 왼쪽 child 였던 A가 붙음
최종적으로 원래 z 입장에서의 왼쪽 subtree는 level이 한 단계 올라가고, 오른쪽 subtree는 level이 한 단계 내려가게 되었음
바꾸어야 할 링크
z를 right rotation 시킨 트리를 다시 left rotation을 하면 원상복구됨
def rotateRight(self, z):
if not z: # z=None인 경우
return
x = z.left
if x == None: # z의 왼쪽 부트리가 없으므로 올라온 x가 없는 것 -> 변하는게 없지
return
b = x.right
x.parent = z.parent # 링크 수정 1
if z.parent: # z.parent가 none일 수도 있음(root)
# 링크 수정 2
if z.parent.left == z:
z.parent.left = x
else:
z.parent.right = x
x.right = z # 링크 수정 3
z.parent = x # 링크 수정 4
z.left = b # 링크 수정 5
if b: # b가 none이 아니면
b.parent = z # 링크 수정 6
if self.root == z:
self.root = x # root 노드 정보 수정