트리
ㅇ롱클래스와 참조를 이용한 방식
각 노드를 객체로 만들고, 자식 노드를 참조(주소값)로 연결하는 형태입니다.
장점 :
트리의 모양이나 크기에 제약이 없어 매우 유연함
노드의 추가, 삭제가 비교적 자유롭다.
재귀 함수를 사용한 순회(Traversal) 로직을 직관적으로 구현 할 수 있다.
class TreeNode {
int val; //노드의 값
TreeNode left; // 왼쪽 자식 노드를 가리키는 참조
TreeNode right; // 오른쪽 자식 노드를 가리키는 참조
// 생성자
TreeNode(int val) {
this.val = val;
}
}
}배열/ArrayList를 이용한 방식
이 방식은 주로 완전 이진 트리(Complete Binary Tree)나 힙(Heap)과 같은 특정 형태의 트리를 표현할 때 매우 효율적입니다.
배열의 인덱스를 이용해 부모-자식 관계를 정의합니다.
인덱스 i에 있는 노드의:
부모 노드 인덱스: (i - 1) / 2
왼쪽 자식 노드 인덱스: 2 * i + 1
오른쪽 자식 노드 인덱스: 2 * i + 2
장점:
완전 이진 트리의 경우, 포인터 메모리 없이 데이터를 빽빽하게 저장할 수 있어 공간 효율이 좋습니다.
인덱스 계산만으로 부모/자식 노드에 빠르게 접근할 수 있습니다.
단점:
트리가 한쪽으로 치우치는 등 모양이 불규칙하면 사용하지 않는 인덱스가 많아져 심각한 공간 낭비가 발생합니다.
노드의 추가, 삭제가 번거로울 수 있습니다.
배열로 표현한 이진 트리를 순회하는 코드
DFS(재귀(스택))을 이용한 순회
전위 : 트리 구성, 직렬화, 루트 우선 방문
중위 : BST 정렬/탐색 문제 -> BST를 중위 순회 하면 오름차순으로 정렬된 채로 출력됨.
후위 : 자식 먼저 처리해야 되는 문제 (트리 조건 확인, DP 삭제 등)

BFS(너비 우선 탐색), 레벨 순서 순회(Level-order-traversal)

핵심 아이디어 : 큐(Queue)의 사용
큐에 루트 노드를 넣는다.
큐가 빌 때까지 다음을 반복한다.
큐에서 노드를 하나 꺼낸다 (Dequeue)
꺼낸 노드를 방문(처리)한다.
꺼낸 노드의 왼쪽 자식이 있다면 큐에 넣는다. (Enqueue)
꺼낸 노드의 오른쪽 자식이 있다면 큐에 넣는다. (Enqueue)
양 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/92343
제약 조건 : 내가 모은 양의 수보다 늑대의 수가 같거나 더 많으면 안됨.
탐색 방법 : 일반적인 트리 순회 (부모 -> 자식)과 다르다. 방문한 노드에 인접한 모든 노드가 다음 방문 대상 후보가 된다.
BFS 풀이
visited 집합이 각 Info 객체마다 독립적으로 관리된다.
now.visited.addAll(tree[now.node])를 통해 현재 노드의 이웃 노드들을 visited 집합에 추가하고 for(int next : now.visited) 루프를 통해 이 visited 집합의 모든 노드를 다음 탐색 대상으로 고려한다.
Last updated