트리의 모든 노드를 한 번씩 방문하는 방법. 같은 층을 먼저 훑는 너비 우선(Breadth-First)과, 한 가지를 끝까지 내려가는 깊이 우선(Depth-First)이 있고, 깊이 우선은 노드를 언제 방문하느냐에 따라 셋으로 나뉜다.
type T = { val: number; left?: T; right?: T }
const preorder = (n?: T): number[] => (n ? [n.val, ...preorder(n.left), ...preorder(n.right)] : [])
const inorder = (n?: T): number[] => (n ? [...inorder(n.left), n.val, ...inorder(n.right)] : [])
const postorder = (n?: T): number[] => (n ? [...postorder(n.left), ...postorder(n.right), n.val] : [])- 전위(Pre-order): 나 → 왼쪽 → 오른쪽. 트리를 그대로 복제하거나 직렬화할 때 구조를 보존한다
- 중위(In-order): 왼쪽 → 나 → 오른쪽. 이진 탐색 트리에서는 값이 오름차순으로 나온다
- 후위(Post-order): 왼쪽 → 오른쪽 → 나. 자식을 먼저 처리해야 하는 일, 예컨대 폴더 크기 합산이나 트리 삭제에 맞다
- 너비 우선(BFS, Breadth-First Search): 큐에 넣으며 층별로 방문한다
무엇을 고를까
시간은 모두 O(n)으로 같고, 메모리가 다르다. 넓고 얕은 트리에서 너비 우선은 한 층 전체를 큐에 담아야 해서 메모리를 많이 쓰고, 깊이 우선은 높이만큼만 쓴다. 반대로 깊고 좁은 트리에서는 깊이 우선의 재귀가 깊어진다.
그래프 일반의 순회는 깊이 우선 탐색 (DFS)와 너비 우선 탐색 (BFS)에 있다. React가 컴포넌트 트리를 훑는 방식도 깊이 우선이다(Fiber 아키텍처).