0. 들어가기
우리는 앞선 시간에 스택과 큐에 대해서 공부했다.
이를 구현하기 위하여 배열과 연결리스트에 대해서 배웠고, 우리는 스택, 큐 구조를 구현했다.
스택과 큐의 경우 데이터를 한줄로 표현이 가능한 선형 구조에 해당했다.
이제 우리가 배워볼것은 계층을 가진 비선형구조, 트리에 대하여 배워 볼 것이다.
1. 트리의 기본 개념
트리의 경우 위와 같이 생겼다.
각 노드가 계층에 따라 갈라지는 모습을 하고있는 것이 나무를 반대로 세워놓은 것과 비슷해서 트리라는 이름이 붙여졌다.
그렇기 때문에 최상위에 있는 노드를 root node라고 부른다. 이와 마찬가지로 최하위에 있는 노드를 leaf node라고 부른다.
- tree 구조의 이름은 나무를 뜻하는 tree에서 가져왔다.
- 최상위 노드를 root node, 최하위 노드를 leaf node라고 부른다.
그럼 이번에는 각 노드간의 관계를 살펴보자.
같은 level에 존재하는 노드들을 형제노드(sibling)이라 부르고 자신의 하위에 있는 노드를 자식노드(children)이라고 부른다. 같은 맥락으로 자신의 상위에 있는 노드를 부모노드(parent)라고 부른다. 또한 자신의 상위에 있는 노드'들'을 조상(ancestor)이라 부른다.
- 자신과 같은 레벨의 노드를 형제노드(sibling)이라 부른다.
- 자신의 하위노드를 자식노드(children)이라 부른다.
- 자신의 상위 노드를 부모노드(parent)이라 부른다.
이번에는 트리의 전체적인 구조를 살펴보자.
트리를 구성하는 일부분의 트리를 subtree 라고 부른다. 또한 그림에는 표시가 안되있으나 subtree의 집합을 forest라고 하며, 트리는 level으로 층이 분류가 되며, 트리의 가장 높은 level이 높이(height)가 된다.
- 트리를 구성하는 일부분의 트리를 subtree라고 한다.
- subtree의 집합을 forest라고 한다.
- 트리의 각 층은 level로 분류되며 가장 높은 level은 높이(height)가 된다.
트리의 기본은 이정도만 하고 가도 충분할 것 같다.
2. 이진트리 (binary tree)
그럼 자세한 트리를 만나볼 시간이다.
이번에 만날 트리는 이진트리, 즉 바이너리트리이다.
바이너리 트리는 왼쪽 자식과 오른쪽 자식, 두개의 자식만 갖는 트리이다.
즉, 좌측 노드와 우측 노드를 나눈다는 것에 의의가 생기는 구조이다.
이러한 바이너리 트리는 노드가 채워진 모양에 따라 다양하게 분류 될 수 있다.
full binary tree, complete binary tree, 등이 존재한다.
이들은 크게 중요한 개념이 아니므로 개인적으로 찾아보면 좋겠다.
다만 정말 중요한 개념은 다음의 것이다.
편향 트리, 경사트리라고도 하는 skewed tree의 모양이다.
노드가 한쪽 방향으로 치우쳐져있는 것을 볼 수있다.
이것이 트리의 단점인데, 데이터가 한쪽으로 치우칠경우 큐나 스택같은 선형구조와 다를게 없으며, 혹은 더 나쁜 상태가 된다.
따라서 이를 해결하기 위한 개념이 필수적인데 그것이 balanced tree 이다.
각 트리의 높이 차이를 제한을 둬서 최대한 균형을 맞춰보겠다는 의미이다.
3. 마무리
우리는 이제 선형구조에서 비선형 구조로 나아가는 첫걸음을 내딛었다.
다음시간에는 트리에서 사용되는 연산과 구현에 대해서 이야기 하자.
'자료구조 및 알고리즘 > C' 카테고리의 다른 글
C - 스택/큐의 응용 (0) | 2021.01.21 |
---|---|
C - 큐(Queue)의 기본 구현 (0) | 2021.01.12 |
C - 스택(Stack) (0) | 2021.01.11 |
C - 연결 리스트(Linked List) (0) | 2021.01.11 |
C - 배열을 활용한 자료구조 (0) | 2021.01.10 |