각 노드가 자식을 최대 둘 가지고, 왼쪽 서브트리의 모든 값은 노드보다 작고 오른쪽은 크다는 규칙을 지키는 트리. 비교할 때마다 한쪽 가지를 버리므로 정렬된 데이터를 빠르게 찾고 넣을 수 있다.
트리 용어
- 루트(Root): 맨 위 노드. 잎(leaf): 자식이 없는 노드
- 부모·자식·형제(Parent, Child, Sibling), 간선(Edge): 노드를 잇는 연결
- 트리는 루트가 하나이고 경로에 순환이 없는 그래프다. HTML DOM, 파일 시스템, JSON, AST(Abstract Syntax Tree)가 모두 트리다
type TreeNode = { val: number; left?: TreeNode; right?: TreeNode }
function insert(node: TreeNode | undefined, val: number): TreeNode {
if (!node) return { val }
if (val < node.val) node.left = insert(node.left, val)
else node.right = insert(node.right, val)
return node
}복잡도
- 균형이 잡혀 있으면 탐색·삽입이
O(log n)이다. 이진 탐색을 구조로 옮긴 셈이다 - 정렬된 값을 차례로 넣으면 한쪽으로만 자라 연결 리스트처럼 되고
O(n)이 된다. 그래서 실제로는 AVL·레드블랙 트리 같은 자가 균형 트리(Self-Balancing Tree)를 쓴다 - 데이터베이스 인덱스는 한 노드에 많은 키를 담는 B-트리(B-Tree) 계열을 쓴다(DB 인덱스와 트레이드오프)
모든 노드를 방문하는 방법은 트리 순회, 부모가 자식보다 항상 크거나 작은 다른 규칙의 트리는 이진 힙이다.