[CS 기초 - 자료구조] Tree

deannn.Park·2021년 10월 20일
0

CS 기초

목록 보기
8/17
post-thumbnail

Tree


트리란 스택이나 큐와 같은 선형 구조가 아닌 비선형 구조이고 계층적 관계(Hierachical Relationship)을 표현하는 자료구조이다.

구성 요소

  • Node(노드): 트리를 구성하고 있는 각각의 요소
  • Edge(간선): 트리에서 노드와 노드 사이를 연결하는 선
  • Root Node(루트 노드): 트리 구조에서 최상단에 위치한 노드. 부모가 없는 노드
  • Termanal Node(Leaf Node, 단말 노드): 하위에 더이상 다른 노드가 연결되어 있지 않은 노드. 자식이 없는 노드
  • Internal Node(내부 노드, 비단말 노드): 단말 노드를 제외한 모든 노드. 루트 노드도 포함.
  • 레벨(level, 깊이(depth)): 루트에서 어떤 노드까지의 경로 길이(간선의 수)
  • 트리의 높이(height): 트리의 최고 레벨
  • 부모 노드: 자신과 연결된 상위 노드
  • 자식 노드: 자신과 연결된 하위 노드
  • 형제 노드: 같은 부모를 가지는 노드
  • 크기(size): 특정 노드가 자신을 포함한 자손의 수
  • 노드의 차수(degree): 노드가 가진 자식 노드의 수
  • 트리의 차수(degree): 노드의 차수 중 최댓값

특징

  • 트리에는 사이클이 존재하지 않는다.
    사이클이 존재한다면, 그것은 트리가 아닌 그래프이다.
  • 루트에서 어떤 한 노드로 가는 경로는 유일하다.
  • 노드의 개수가 N개이면 간선의 개수는 N-1개이다.

 

트리 순회 방식


트리 순회 방식은 총 4가지이다.

1. 전위 순회 (pre-order)

루트 노드 먼저 방문하는 순회 방법이다.
트리에서 루트에서 시작하여 루트 노드 -> 왼쪽 하위 트리 -> 오른쪽 하위 트리 순서로 순회하는 방법이다.
위의 높이가 2인 트리를 예를 들면 1 -> 2 -> 3 이다.

초록색 노드를 가진 높이가 4인 트리를 전위 순회하면 순서는 아래와 같다.

  • 1 -> 2 -> 4-> 8 -> 9 -> 5 -> 10 -> 11 -> 3 -> 6 -> 13 -> 7 -> 14

2. 중위 순회 (in-order)

왼쪽 하위 트리를 먼저 방문 후 루트 노드, 오른쪽 하위 트리를 방문하는 순회 방법이다.
트리에서 루트에서 시작하여 왼쪽 하위 트리 -> 루트 노드 -> 오른쪽 하위 트리 순서로 순회하는 방법이다.
위의 높이가 2인 트리를 예를 들면 2 -> 1 -> 3이다.

초록색 노드를 가진 높이가 4인 트리를 중위 순회하면 순서는 아래와 같다.

  • 8 -> 4 -> 9 -> 2 -> 5 -> 10 -> 11 -> 1 -> 6 -> 13 -> 3 -> 7 -> 14

3. 후위 순회 (post-order)

왼쪽부터 하위 트리들을 먼저 모두 방문 후 루트 노드를 방문하는 순회 방법이다.
트리에서 루트에서 시작하여 왼쪽 하위 트리 -> 오른쪽 하위 트리 -> 루트 노드 순서로 순회하는 방법이다.
위의 높이가 2인 트리를 예를 들면 2 -> 3 -> 1이다.

초록색 노드를 가진 높이가 4인 트리를 중위 순회하면 순서는 아래와 같다.

  • 8 -> 9 -> 4 -> 10 -> 11 -> 5 -> 2 -> 13 -> 6 -> 14 -> 7 -> 3 -> 1

4. 레벨 순회 (level-order)

루트 노드부터 계층별로 방문하는 방법이다.
위의 높이가 2인 트리를 예를 들면 1 -> 2 -> 3이다.

초록색 노드를 가진 높이가 4인 트리를 중위 순회하면 순서는 아래와 같다.

  • 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 13 -> 14

 

트리 종류


Binary Tree (이진 트리)

모든 노드의 차수가 2 이하인 트리를 말한다.

기본적으로 위와 같은 형태를 띈다. 이진 트리도 형태에 따라 다양한 이진트리가 존재한다.

Perfect Binary Tree (포화 이진 트리)

위 그림과 같이 모든 레벨이 꽉 찬 이진 트리를 포화 이진 트리하고 한다.

Complete Binary Tree (완전 이진 트리)

위 그림과 같이 단말노드를 제외한 모든 노드가 위에서 아래로, 왼쪽에서 오른쪽으로 차곡차곡 채워진 이진트리를 완전 이진 트리라고 한다.

Full Binary Tree (정 이진 트리)

위 그림과 같이 모든 노드가 0개 또는 2개의 자식 노드만을 가지고 있는 트리를 정 이진 트리라고 한다.

배열에서의 이진 트리
배열에서 이진트리의 노드 개수가 n개이고 루트 노드가 1에서 시작할 때, i번째 노드에 대해 부모 노드, 자식 노드의 index는 아래와 같다.

parent(i) = i / 2
left_child(i) = 2i
right_child(i) = 2i+1

 

BST (Binary Search Tree, 이진 탐색 트리)

효율적으로 탐색이 가능하고, 이를 위해 효율적으로 저장하는 방법을 고안한 자료구조이다.
이진 탐색 트리는 이진 트리의 한 종류이고, 데이터를 저장하는 규칙이 있다.

규칙

  1. 이진 탐색 트리의 노드에 저장된 키는 유일하다.
  2. 부모의 키가 왼쪽 노드의 키보다 크다.
  3. 무보의 키가 오른쪽 자식의 키보다 작다.
  4. 왼쪽과 오른쪽 서브 트리도 이진 탐색 트리이다.
  5. 중복된 노드는 없다.

중복이 없는 이유?
중복이 많은 경우에 트리를 사용하여 검색 속도를 느리게 할 필요가 없다.
트리에 삽입하는 것보다 노드에 count 값을 가지게 하여 처리하는 것이 효율적이다

시간 복잡도

  • 균등 트리: Big-O(log n)
  • 편향 트리: Big-O(n)

편향 트리
데이터를 계속 추가하다 보면 지속적으로 한쪽으로만 노드가 추가될 수 있다. 이러면 데이터가 한쪽으로만 몰리는 편향트리가 된다. 이 경우에 균형을 잡기 위한 재조정(Rebalacing)을 수행해야 한다. 이 기법을 구현한 트리 중 하나가 Red-Black Tree이다.

생성 예시

50, 15, 62, 70, 7, 54, 11

위의 숫자를 순서대로 이진 검색 트리에 삽입하면 아래와 같은 순서로 수행된다.

검색 (Serach)

  1. 루트에서 시작합니다.
  2. 검색값을 루트와 비교, 루트보다 작으면 왼쪽 자식트리로, 크다면 오른쪽 자식트리로 이동니다.
  3. 이동한 자식 트리에 대해 2번을 반복합니다.
  4. 원하는 값을 찾지 못하면 null을 반환합니다.

삽입 (insert)

  1. 루트에서 시작합니다.
  2. 삽입값을 루트와 비교, 루트보다 작으면 왼쪽 자식트리로, 크다면 오른쪽 자식트리로 이동니다.
  3. 이동한 자식 트리에 대해 2번을 반복합니다.
  4. 리프 노드에 도달한 후 노드보다 작으면 왼쪽, 크면 오른쪽에 삽입합니다.

삭제 (delete)

삭제는 3가지의 경우로 나누어 수행합니다.

1. 삭제할 노드가 리프 노드일 경우

  • 이 경우에는 그냥 삭제합니다.

2. 삭제할 노드에 자식이 하나만 있는 경우

  • 삭제한 노드를 삭제하고, 자식 노드는 삭제된 노드의 무보 노드에 직접 연결합니다.

3. 삭제할 노드에 자식이 둘 있는 경우

  • 오른쪽 서브 트리에서 가장 작은 값 또는 왼쪽 서브 트리에서 가장 큰 값을 삭제할 노드 자리로 올립니다.

참고
한재엽님 Github Interview_Question_for_Beginner
gyoogle님 Github tech-interview-for-developer
http://www.ktword.co.kr/test/view/view.php?no=4726
https://yoongrammer.tistory.com/71

profile
컴퓨터 관련 여러 분야 공부중

0개의 댓글