트리(TREE)
계층적인 구조를 나타내는 자료구조
부모-자식 관계의 노드들로 이루어짐
* 리스트, 스택, 큐 등은 선형 자료 구조
응용분야
계층적인 조직 표현
컴퓨터 디스크의 디렉토리 구조
- 회사의 조직
파일 디렉토리 구조
- 결정트리
트리의 용어
노드(node): 트리의 구성요소
루트(root): 부모가 없는 노드(A)
서브트리(subtree): 하나의 노드와 그 노드들의 자손들로 이루어진 트리
단말노드(terminal node): 자식이 없는 노드(E,F,G,H,I,J)
비단말노드: 적어도 하나의 자식을 가지는 노드(A,B,C,D)
트리의 예제
A는 루트 노드이다
B는 D와 E의 부모노드이다
C는 B의 형제 노드이다
D와 E는 B의 자식노드이다
B의 차수는 2이다
위의 트리의 높이는 4이다
이진 트리(binary tree)
모든 노드가 2개의 서브 트리를 가지고 있는 트리
서브트리는 공집합일수 있음
이진트리의 노드에는 최대 2개까지의 자식 노드가 존재
모든 노드의 차수가 2 이하가 된다-> 구현하기가 편리함
이진 트리에는 서브 트리간의 순서가 존재
이진 트리 검증
- 이진 트리는 공집합이거나
- 루트와 왼쪽 서브 트리, 오른쪽 서브 트리로 구성된 노드들의 유한 집합으로 정의됨
- 이진트리의 서브 트리들은 모두 이진트리여야 함
- 노드의 개수가 n개이면 간선의 개수는 n-1
- 높이가 h인 이진트리의 경우, 최소 h개의 노드를 가지며 최대 2^h-1개의 노드를 가짐
- 높이가 5인 포화 이진트리의 노드의 수는? 31개
- 레벨 1부터 k-1까지는 노드가 모두 채워져 있고
마지막 레벨 k에서는 왼쪽부터 오른쪽으로 노드가 순서대로 채워져 있는 이진트리
- 포화 이진 트리와 노드 번호가 일치
- 모든 이진트리를 포화이진트리라고 가정하고 각 노드에 번호를 붙여서
그 번호를 배열의 인덱스로 삼아 노드의 데이터를 배열에 저장하는 방법
ex) - 노드 i의 부모 노드 인덱스 = i/2
- 노드 i의 왼쪽 자식 노드 인덱스 = 2i
- 노드 i의 오른쪽 자식 노드 인덱스 = 2i+1
- 포인터를 이용하는 방법
2. 링크 표현법 (포인터를 이용하는 방법)
노드는 구조체로 표현
typedef struct TreeNode { int data; struct TreeNode *left, *right; } TreeNode; |
이진 트리의 순회
루트가 제일 앞에
순환호출을 이용한 전위 순회
preorder(x) if x≠NULL then print DATA(x); preorder(LEFT(x)); preorder(RIGHT(x)); |
명시되어 있지는 않지만 NULL 값일 경우 return 한다고 봄
중위 순회 알고리즘
inorder(x) if x≠NULL then inorder(LEFT(x)); print DATA(x); inorder(RIGHT(x)); |
후위 순회 알고리즘
postorder(x) if x≠NULL then postorder(LEFT(x)); postorder(RIGHT(x)); print DATA(x); |
레벨 순회(level order)
각 노드를 레벨 순으로 검사하는 순회 방법
지금까지의 순회법이 스택을 사용했던 것에 비해 레벨 순회는 큐를 사용하는 순회법이다.
level_order(root) initialize queue; enqueue(queue, root); while is_empty(queue)≠TRUE do x← dequeue(queue); if( x≠NULL) then print DATA(x); enqueue(queue, LEFT(x)); enqueue(queue, RIGHT(x)); |
- 후위순회를 사용
- 서브트리의 값을 순환호출로 계산
- 비단말노드를 방문할때 양쪽서브트리의 값을 노드에 저장된 연산자를 이용하여 계산한다
evaluate(exp) if exp = NULL then return 0; else x←evaluate(exp->left); y←evaluate(exp->right); op←exp->data; return (x op y); |
int get_node_count(TreeNode *node) { int count=0; if( node != NULL ) count = 1 + get_node_count(node->left)+ get_node_count(node->right); return count; } |
int get_height(TreeNode *node) { int height=0; if( node != NULL ) height = 1 + max(get_height(node->left), get_height(node->right)); return height; } |
'Study' 카테고리의 다른 글
CCNA Broadband Solutions (0) | 2014.06.15 |
---|---|
MySQL 쿼리 연습 (모든 테이블 확인, 더미 데이터 생성) (0) | 2014.06.02 |
CCNA Frame Relay(프레임릴레이) (2) | 2014.05.27 |
CCNA PPP Point-to-Point Protocol (0) | 2014.05.26 |
MySQL 명령어 쿼리 (0) | 2014.05.25 |