

✅ 트리의 기본 구현
class Tree {
constructor(value) {
this.value = value;
this.children = [];
}
insertNode(value) {
const childNode = new Tree(value);
this.children.push(childNode);
}
contains(value) {
if (this.value === value) {
return true;
}
for (let i = 0; i < this.children.length; i++) {
const childNode = this.children[i];
if (childNode.contains(value)) {
return true;
}
}
return false;
}
}
✅ 트리의 지름
1. DFS를 이용해서 최장경로를 저장하는 cost배열 생성
2. 임의의 정점 X가 있을때 X에 대해서 가장 멀리는 있는 정점 Y
3. 정점 Y에 대해서 가장 멀리있는 정점에 대한 거리 = 트리의 지름
전위 순회 : 루트 왼쪽자식 오른쪽자식
중위 순회 : 왼쪽자식 루트 오른쪽자식
후위 순회 : 왼쪽자식 오른쪽자식 루트
✅ 힙 vs 이진 검색 트리
힙
- 각 노드의 값이 자식보다 크거나 같음 (좌우 자식의 크기는 상관X)
- 최대, 최소값을 빠르게 검색하기 위한 구조
- n개의 노드를 가질 경우 높이가 log(N)이기 때문에 O(log(N))
트리
- 좌우 자식도 크기를 비교
- 특정 트리를 빠르게 탐색하기 위한 구조
- 연결리스트를 이용한 구현은 탐색 : O(N), 삽입과 삭제 : O(1)
✅ 백준 15681 - 트리와 쿼리
let tree = Array.from(Array(N + 1), () => []);
let visited = Array(N + 1).fill(false);
let dp = Array(N + 1).fill(0);
arr.forEach((el) => {
let [from, to] = el;
tree[from].push(to);
tree[to].push(from);
});
function DFS(node) {
if (visited[node]) return dp[node];
visited[node] = true;
dp[node] += 1;
for (let next of tree[node]) {
if (visited[next]) continue;
dp[node] += DFS(next);
}
return dp[node];
}
DFS(R);