트리(Tree) 구조
by ERC재이수
1. 개요
Tree는 말 그대로 나무 비스무리한 구조긴한데, 현실 나무 처럼 위로 뻗는게 아니라 가계도처럼 위에서 아래로 뻗는다고 생각하면된다.
Tree는 Cycle (어느 지점에서 출발해서 다시 출발한 곳으로 돌아오는것) 이 없는 Node들의 모음이다.
본문을 소개하기 이전에 tree 관련 정의에 대해 설명하겠다.
2. 정의
-
Root : 부모(Parent)라고 불리는 상위 노드가 없는 노드를 root라고 한다.
ex) A
-
Leaf : 아이(children)라고 불리는 하위 노드가 없는 노드를 leaf라 한다. Leaf는 degree가 0이다.
ex) K,L,F,G,M,I,J
-
Degree of node : 노드 하나에 연결되어 있는 Subtree의 개수.
ex) degree of a=3, c=1, f=0
-
Degree of tree : tree안에서 가장 많은 degree
ex) degree of tree = 3 (A,D)
-
Sibling : 같은 부모(Parent)를 둔 아이들(children)
ex) (H,I,J) (E,F) (K,L) (B,C,D)
-
Path : 각각의 노드에서 인접한 다음 노드로의 순서
-
Ancestors : root로부터 그 노드까지의 path를 따라가는 모든 노드
ex) M의 ancestors: A,D,H
-
Decendants : subtree에 있는 모든 노드
ex) B의 decendants: E,F,K,L
-
Level of node : root 노드를 1이라 잡고, 한 노드의 레벨을 L이라 하면, 그 노드의 자식의 레벨은 L+1
ex) Level of M : 4
-
Height / Depth of tree : tree의 제일 큰 level. 이미지의 heigh는 4.
3. Binary Tree
이번 글에서는 Binary tree에 대해 다룰 것이다.
Binary tree란 아예 비었거나, root와 left, right로 불리는 서로 다른 subtree로 구성된 유한한 노드의 집합이다.
어떤 노드든 최대 2개의 children을 가질수 있고, children들은 ordered(순서를 가지고 있는)되어있다.
- Binary Tree의 종류
- Skewed binary tree
한쪽으로 치우쳐저있는 구조다. 이게 심해지면, Linear(선형)구조와 다를게 없게 된다. 그러면 데이터 탐색시 시간이 길어질 수 있다.
- Full binary tree of depth k
2의 k(k>=0)승 - 1개의 노드를 가지고 있는 binary tree
ex) depth 3의 full binary tree의 노드 개수는 2의 3승(8) - 1 = 7개
- Complete binary tree
영문으로는 ‘A binary tree with n nodes and depth k is complete iff(if and only if) its nodes correspond to the nodes numbered 1 to n in the full binary tree’ 라고 하는데 간단하게 말하면, 왼쪽부터 차례대로 채워놓은 트리다.
4. Binary Tree의 표현 방법
- 배열(array)로 표시하기
n개의 노드를 가진 complete binary tree면, 1 <= i <= n 의 인덱스 i값이 있을때
-
parent(i) (i의 부모 노드)는 i=/=1이면 i/2에 있고, i=1이면 i는 root거나 no parent 상태
-
left child(i) (i의 자식 노드)는 2i<=n이면, 2i에 있고, 2i>n이면 i는 no left child 상태
-
right child(i) (i의 자식 노드)는 2i+1<=n이면, 2i+1에 있고, 2i+1>n이면 i는 no right child 상태
ex) 이미지의 B:2, 1<=(i=2)<=9 의 부모는 2/2 =1, A노드이고, left child는 2X2 = 4, D노드이고, right child는 2X2+1 = 5, E노드이다.
- 링크드 리스트로 표시하기
그림만 봐선 링크드리스트의 표현이 좀 더 간단해보인다;; 하지만 구현이 좀 더 어려움으로 각자 상황에 맞게 배열로 할지 링크드리스트로 할지 정하자
5. Binary Tree Traversal
Traversals란 각각의 노드를 정확히 1번씩만 탐색하는것이다.
탐색 순서에 따라 종류가 있다.
- In-order-Traverse: L-> C -> R
- Pre-order-Traverse: C-> L -> R
- Post-order-Traverse: L-> R -> C
번외로 Level-order-Traverse가 있는데 트리의 각 레벨에 가장 왼쪽노드부터 탐색하는것으로 보면 된다. 밑의 이미지를 level-order로 탐색하면 +ED/CAB가 나온다.
6. 코드
https://github.com/21600055/DataStructures/blob/main/src/main/java/DataStructures/Tree.java
7. 결과 이미지
위의 코드를 돌리면, 1~7까지 level-order로 넣으면 밑의 이미지 처럼된다.
이런 트리를 Inorder, Preorder, Postorder로 traverse를 하면 밑의 이미지처럼 된다.
개인적으로 정리한 자료구조입니다. 수정되거나 건의할 사항이 있으면, 21600055@handong.edu로 메일 바랍니다.
Subscribe via RSS