용어 정의
트리 : 나무 기둥에서 가지가 뻗어나가는 모습을 거꾸로 뒤집어 놓은 모양. 따라서 나무 밑둥 (루트)이 맨 위에 있음
노드 : 트리를 구성하는 요소. 맨 위에 있는 노드를 루트라고 함
엣지 : 노드와 노드를 연결하는 선. 간선이라고도 함
레벨 : 루트 노드로부터 특정 노드까지 거쳐가는 최소한의 간선 수
부모 노드 : 기준 노드 위에 있는 노드
자식 노드 : 기준 노드 하위에 있는 노드
형제 노드 : 같은 부모를 가지는 노드
리프 노드 : 자식이 없는 노드. 말단 노드라고도 함
구현 예시
배열로 표현
- 이진 트리의 경우 가능한 방식.
- 트리를 0번 인덱스가 아닌 1번 인덱스부터 넣는다고 가정할 때 아래의 공식이 작용함
- 왼쪽 자식 노드의 인덱스는 부모 노드의 배열 인덱스 * 2
- 오른쪽 자식 노드의 인덱스는 부모 노드의 배열 인덱스 * 2 + 1
포인터로 표현
- 왼쪽 자식 노드 포인터 / 값 / 오른쪽 자식 노드 포인터
- 구현 난이도 어려움
인접 리스트로 표현
- 바로 한 단계 자식 노드를 저장함

- 이 그래프를 인접 리스트로 표현하면 아래와 같음
1 -> 4, 6
2
3
4 -> 3, 5
5
6 -> 2
순회 방법
전위 순회
- 부모 → 왼쪽 자식 → 오른쪽 자식
- 거치는 노드를 우선 방문함
- 트리를 복사할 때 많이 사용됨
중위 순회
- 왼쪽 자식 → 부모 → 오른쪽 자식
- 이진 탐색 트리에서 정렬된 순서대로 값을 가져올 때 사용됨
후위 순회
- 왼쪽 자식 → 오른쪽 자식 → 부모
- 자식 노드부터 방문한다는 특성 때문에, 트리 삭제에 사용됨
이진 탐색 트리
- 데이터가 작으면 왼쪽 자식으로, 크면 오른쪽 자식으로 구성된 트리
탐색 방법
- 찾으려는 값이 현재 노드의 값과 같으면 탐색을 종료
- 찾으려는 값이 현재 노드의 값보다 크다면 오른쪽 자식으로 탐색
- 찾으려는 값이 현재 노드의 값보다 작다면 왼쪽 자식으로 탐색
- 값을 찾으면 종료. 노드가 없을 때 까지 계속 탐색했는데 값이 없다면 트리에 값이 없는 것.
시간 복잡도
- 기본적으로, 저장된 노드가 N개라면 시간 복잡도는 O(logN)임
- 그러나 균형이 맞지 않을 때 (왼쪽/오른쪽 서브 트리의 높이 차가 1보다 큰 경우) 시간 복잡도는 배열 O(n)과 유사함
균형 이진 탐색 트리
- 치우치지 않도록 균형을 맞춰 만들어 둔 트리
- AVL 트리, 레드-블랙 트리 등 더 자세한 분류가 있음
- 시간 복잡도를 O(logN)으로 유지함
- 그러나 구현 난이도가 높음