daram 2021. 10. 27. 13:38

트리란?

 

사이클이 없는, 연결된 구조

정점의 개수 (vertex, node) : n개

간선의 개수 (edge) : n-1개

 

정점의 개수가 n개

간선의 개수가 n-1개 라고 트리인 것은 아니다.

연결된 구조가 아니면 트리 구조가 아니다.

 

트리의 유형 1 ( 루트가 있는 트리 )

1번을 루트로 가정하자 (루트는 마음대로 정할 수 있다.)

parent - child 관계로 묶을 수 있다.

형제으이 관계도 있다. (2 - 3은 형제, 4 - 5는 형제, 6 - 7은 형제)

 

 

깊이

루트에서의 거리

깊이의 정의는 0부터 시작할 수 있고, 1부터 시작할 수도 있다.

문제마다 다를 수 있는 부분이다.

 

조상과 자손

2의 조상은 2, 1

2의 자손은 2, 4, 5

조상과 자손은 parent, child와 달리 자기자신을 포함한다.

 

이진 트리

자식을 최대 2개만 가지고 있는 트리

포화 이진 트리

리프 노드를 제외한 노드의 자시그이 수: 2

리프 노드의 자식의 수: 0

포화 이진 트리의 노드의 수는 깊이가 h일 때 (2의 h승 - 1)이다.

완전 이진 트리

리프 노드를 제외한 노드의 자시그이 수: 2

리프 노드의 자식의 수: 0

마지막 레벨에는 노드가 일부는 없을 수 있음.

오른쪽에서부터 몇 개가 사라진 형태

트리의 표현

모든 노드는 부모를 가지고 있고 부모가 없는 건 루트 뿐이다.

루트의 부모는 0으로 지정해주면 된다.

부모는 한번에 찾을 수 있지만 자식을 찾는데는 시간이 걸린다.

 

완전 이진 트리에서의 배열의 표현

완전 이진 트리의 경우에는 배열로 표현할 수 있다. 이것이 가장 효율적이다.

 

클래스를 이용한 표현

클래스를 이용하여 트리를 표현할 수도 있다.

 

트리의 순회

트리의 모든 노드를 방문하는 순서이다.

그래프의 경우에는 DFS와 BFS가 있었다.

트리에서도 위의 두 방법을 사용할 수 있다.

DFS는 아래와 같이 3가지 출력 순서가 있다.

프리오더

인오더

포스트오더

프리오더 (A -> B -> D -> E -> C -> F -> G)

dfs의 방문하는 것과 동일하다.

자식이 부모의 값을 사용할 때 프리오더를 사용한다.

노드 방문 

왼쪽 자식 노드를 루트로 하는 서브 트리 인 오더

오른쪽 자식 노드를 루트로 하는 서브 트리 인 오더

 

인오더 (D -> B -> E -> A -> F -> C -> G)

일반적으로 잘 사용하지 않는다. 이진 트리에서만 가능

왼쪽 자식 노드를 루트로 하는 서브 트리 인 오더

노드 방문

오른쪽 자식 노드를 루트로 하는 서브 트리 인 오더

 

포스트오더 (D -> E -> B -> F -> G -> C -> A)

가장 많이 사용 ( 자식에 대한 정보를 이용하여 현재 노드를 계산할 때 포스트오더를 사용한다.)

왼쪽 자식 노드를 루트로 하는 서브 트리 인 오더

오른쪽 자식 노드를 루트로 하는 서브 트리 인 오더

노드 방문

 

백준 트리 순회 문제를 풀어보자 

boj.kr/1991