이진 트리
- 모든 노드들이 2개의 서브트리를 갖는 특별한 형태의 트리
- 각 노드가 자식 노드를 최대한 2개 까지만 가질 수 있는 트리 : 왼쪽 자식 노드(left child node), 오른쪽 자식 노드(right child node)
- 이진 트리의 예
이진 트리 - 특성
- 레벨 i에서의 노드의 최대 개수는 2^i개
- 높이가 h인 이진 트리가 가질 수 있는 노드의 최소 개수는 (h+1)개, 최대 개수는 (2^(h+1) - 1)개
이진 트리 - 종류
포화 이진 트리(Full Binary Tree)
- 모든 레벨에 노드가 포화상태로 차있는 이진 트리
- 높이가 h일 때, 노드의 개수가 (2^(h+1) - 1)인 이진 트리
- 높이가 3일 때 노드의 개수 : 2^(3+1) - 1 = 15개
- 루트를 1번으로 하여 2^(h+1) - 1까지 정해진 위치에 대한 노드 번호를 가짐
완전 이진 트리(Complete Binary Tree)
- 높이가 h이고 노드 수가 n개일 때 (단, h+1 <= n <= 2^(h+1) - 1), 포화 이진 트리의 노드 번호 1번부터 n번까지 빈 자리가 없는 이진 트리
- 예) 노드가 10개인 완전 이진 트리
편향 이진 트리(Skewed Binary Tree)
- 높이 h에 대한 최소 개수의 노드를 가지면서 한쪽 방향의 자식 노드만을 가진 이진 트리
이진 트리 - 순회(traversal)
순회(traversal)
- 트리의 노드들을 체계적으로 방문하는 것
- 트리의 각 노드를 중복되지 않게 전부 방문(visit)하는 것을 말하는데 트리는 비선형 구조이기 때문에 선형구조에서와 같이 선후 연결 관계를 알 수 없다. 따라서 특별한 방법이 필요하다.
순회 방법
1. 전위 순회(preorder traversal) : VLR
- 부모 노드 방문 후, 자식 노드를 좌→우 순서로 방문
- 수행 방법
1. 현재 노드 n을 방문하여 처리한다. (V)
2. 현재 노드 n의 왼쪽 서브트리로 이동한다. (L)
3. 현재 노드 n의 오른쪽 서브트리로 이동한다. (R)
def preorder_traverse(T): # 전위 순회
if T: # T가 유효한 노드면
visit(T)
preorder_traverse(T.left_child)
preorder_traverse(T.right_child)
2. 중위 순회(inorder traversal) : LVR
- 왼쪽 자식 노드→부모노드→오른쪽 자식 노드 순으로 방문
- 수행 방법
1. 현재 노드 n의 왼쪽 서브트리로 이동한다. (L)
2. 현재 노드 n을 방문하여 처리한다. (V)
3. 현재 노드 n의 오른쪽 서브트리로 이동한다. (R)
def inorder_traverse(T): # 중위 순회
if T: # T가 유효한 노드면
inorder_traverse(T.left_child)
visit(T)
inorder_traverse(T.right_child)
3. 후위 순회(postorder traversal) : LRV
- 자식 노드를 좌→우 순서로 방문 후, 부모 노드로 방문
- 수행 방법
현재 노드 n의 왼쪽 서브트리로 이동한다. (L)
현재 노드 n의 오른쪽 서브트리로 이동한다. (V)
현재 노드 n을 방문하여 처리한다. (R)
def post_traverse(T): # 후위 순회
if T: # T가 유효한 노드면
post_traverse(T.left_child)
post_traverse(T.right_child)
visit(T)
순회(traversal) 연습 문제
전위 순회 (preorder traversal)
- A - B - D - H - I - E - J - C - F - K - G - L - M
중위 순회 (inorder traversal)
- H - D - I - B - J - E - A - F - K - C - L - G - M
후위 순회 (postorder traversal)
- H - I - D - J - E - B - K - F - L - M - G - C - A
이진 트리의 표현
트리의 표현 - 연결리스트
1. 이진 트리에 각 노드 번호를 다음과 같이 부여(루트의 번호를 1로 함)
2. 레벨 n에 있는 노드에 대하여 왼쪽부터 오른쪽으로 (2^n)부터 (2^(n+1) - 1)까지 번호를 차례로 부여
노드 번호의 성질
1. 노드 번호가 i인 노드의 부모 노드 번호 : floor(i/2)
2. 노드 번호가 i인 노드의 왼쪽 자식 노드 번호 : 2 * i
3. 노드 번호가 i인 노드의 오른쪽 자식 노드 번호 : 2 * i + 1
4. 레벨 n의 노드 시작 번호 : 2^n
- 노드 번호를 배열의 인덱스로 사용
- 레벨 I의 최대 노드 수 : 2^i
- 높이가 h인 이진 트리를 위한 배열의 크기 : 1 + 2 + 4 + 8 + .. + 2^i = 2^(h+1) - 1
배열을 이용한 이진 트리 표현의 단점
- 편향 이진 트리의 경우에 사용하지 않는 배열 원소에 대한 메모리 공간 낭비 발생
- 트리의 중간에 새로운 노드를 삽입하거나 기존의 노드를 삭제할 경우 배열의 크기 변경이 어려워 비효율적
트리의 표현 - 연결리스트
- 배열을 이용한 이진 트리의 단점을 보완하기 위해 연결리스트를 이용하여 트리를 표현할 수 있다.
- 연결 자료구조를 이용한 이진트리의표현
- 이진 트리의 모든 노드는 최대 2개의 자식 노드를 가지므로 일정한 구조의 단순 연결 리스트 노드를 사용하여 구현
수식 트리
- 수식을 표현하는 이진 트리
- 수식 이진 트리(Expression Binary Tree)라고 부르기도 함
- 연산자는 루트 노드이거나 가지 노드
- 피연산자는 모두 잎 노드
수식 트리의 순회
- 중위 순회 : A / B * C * D + E
- 후위 순회 : A B / C * D * E +
- 전위 순회 : + * * / A B C D E
'CS 이론 > 자료구조' 카테고리의 다른 글
힙(Heap) (0) | 2021.04.11 |
---|---|
이진 탐색 트리(Binary Search Tree) (0) | 2021.04.11 |
트리(Tree) (0) | 2021.04.07 |