삽입이 붙는 자리
문제 1~4는 빈 BST에 키 45, 25, 60, 15, 35, 50, 70, 30, 55를 차례로 넣은 트리를 쓴다. 괄호 표기는 (왼쪽 부분 트리, 오른쪽 부분 트리), -는 빈 자식이다. 문제 2와 3의 삭제는 각각 이 트리에서 따로 시작한다.
- 키 30과 55를 넣을 때 지나온 노드와 붙은 자리, 비교 횟수를 적는다.
- 아홉 키를 모두 넣은 트리를 괄호 표기로 적는다.
- 이미 있는 키 35를 다시 넣을 때 Map 방식의 동작을 적는다.
- 탐색이 멈춘 자리에 붙여도 ordering invariant(순서 불변식)가 깨지지 않는 이유를 적는다.
해설 펼치기
- 30: 45 → 25 → 35를 지나 35의 왼쪽에 붙는다. 55: 45 → 60 → 50을 지나 50의 오른쪽에 붙는다. 둘 다 지나온 노드는 3개다.
_put처럼<를 먼저, 거짓이면>를 비교하면 키 비교는 30이 4번(45에서 1, 25에서 2, 35에서 1), 55가 5번(45에서 2, 60에서 1, 50에서 2)이다. - 45(25(15, 35(30, -)), 60(50(-, 55), 70))다.
- 노드를 새로 만들지 않고 키 35의 값을 새 값으로 갱신한다. 노드 수는 그대로다.
- 지나온 노드와 이미 대소를 비교했고 매번 조건에 맞는 쪽으로 내려왔으므로 멈춘 자리에서도 조건이 유지된다.