반응형
지금까지 다뤄본 자료구조들을 모두 선형적인 일차원 구조였습니다. 즉, 처음부터 끝까지 차례로 이동하면 모든 노드를 거칠 수 있었죠. 하지만 트리(Tree)는 대표적인 비선형구조(Non-linear structure)로 2차원구조 입니다.
트리(Tree) 구조는 일상에서도 많이 볼 수 있는데요, 대표적으로 탐색기 폴더구조를 들 수 있습니다. 로컬디스크(C:)에 여러 폴더들이 존재하고 그 하위 폴더 그 아래 하위 폴더 등으로 구성되는 구조입니다.
트리(Tree) 구조는 나무를 거꾸로 뒤집어 놓은 것 같은 모양입니다. 가장 위에 있는 노드를 root라 하고 거기서 시작하여 가지 (link)가 밑으로 향하며 맨 아래에 잎(leaf)이 달려 있습니다.
위 그림을 가지고 트리(Tree)구조에서 일반적으로 사용하는 용어를 정리해 보도록 하겠습니다.
- 노드(Node) : 위에서 동그라미 모양으로 되어 있고 정보를 담고 있는 곳을 의미하며 버텍스(Vertex)라고도 합니다.
- 링크(Link) : 노드를 선으로 연결한 것으로 엣지(Edge)라고도 부릅니다.
- 루트(Root) : 위 그림에서 트리(Tree)의 시작인 노드를 가리킵니다.
- 레벨(Level) : 루트 노드인 A를 level1, B,C,D를 level2, E~I를 level3, J를 level4라 부릅니다. root를 level1으로 놓고 한 단계씩 깊어질 수록 level이 1씩 증가합니다.
- 부모-자식(Parent-Children) : A와 B의 관계를 보면 위에 있는 A가 B의 부모입니다. 반대로 B는 A의 자식입니다. level이 1차이나는 노드간의 관계를 말합니다.
- 조부모(Grandparent) : 예상 하셨겠지만 level이 2차이나는 노드간의 관계를 말합니다. A와 E, C와 J등의 관계에서 앞의 노드를 의미합니다. 마찬가지로 Grandchildren의 의미도 이해하시겠죠?
- 형제(Sibling) : 같은 level의 노드의 관계를 의미합니다. B,C,D의 관계 또는 E,F,G,H,I의 관계를 말하죠.
- 잎(Leaf) : E,F,G,H,J,D와 같이 자식이 없는 노드를 말합니다. 끝이라는 의미로 터미널 노드(Terminal Node)라고도 하고, 외부노드(External Node)라고도 부릅니다. 반대로 A, B, C, I같이 자식이 있는 노드는 논터미널 노드(Nonterminal Node) 또는 내부노드(Internal Node)라고 합니다.
- 서브트리(Subtree) : 트리구조에서 일부분을 서브트리라고 합니다. 위 그림에서 A의 자식인 B,C,D를 각각 루트로 보면 작은 3개의 트리로 나눠서 생각할 수 있습니다.
- 이진트리(Binary Tree) : 자식 노드를 최대로 2개까지 가질 수 있는 특수한 형태의 트리입니다. 이진트리는 비교적 실용적이고 구현하기가 용이하므로 가장 널리 사용합니다.
위 그림의 두 이진트리(Binary Tree)를 보면 왼쪽은 마지막 레벨(Level)을 제외하고 꽉 차있네요. 오른쪽은 모든 레벨이 꽉차 있습니다. 왼쪽을 꽉차있는 이진트리(Full binary tree) 오른쪽을 완전 이진트리(Complete binary tree)라고 부릅니다.
이진트리의 기본 자료형은 다음과 같이 정의 할 수 있겠네요.
typedef struct _node {
char key;
struct _node *left; /* 왼쪽 자식 노드 */
struct _node *right; /* 오른쪽 자식 노드 */
} node;
위와 같이 정의한 이진트리 자료형으로 다음시간에는 트리 순회 (Tree Traverse)를 해보겠습니다.
반응형
'프로그래밍 > 자료구조' 카테고리의 다른 글
[C언어와 함께 자료구조를] 연결리스트로 스택 구현 (0) | 2020.07.29 |
---|---|
[C언어와 함께 자료구조를] 이진트리 순회 (Binary Tree Traverse) (0) | 2020.07.04 |
[C언어와 함께 자료구조를] 환형연결리스트 (Circular Linked List) (0) | 2018.11.20 |
[C언어와 함께 자료구조를] 연결리스트 (Linked List) - 개념과 구현 (0) | 2018.11.20 |
[C언어와 함께 자료구조를] 큐(Queue)의 개념, 배열로 큐 구현하기 (0) | 2015.03.21 |
댓글