• 검색 결과가 없습니다.

자료구조:

N/A
N/A
Protected

Academic year: 2021

Share "자료구조:"

Copied!
43
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

자료구조: CHAP 8 트리(1)

2021. 5. 24

순천향대학교 컴퓨터공학과

(2)

목차

 트리, 이진 트리의 개념

 이진 트리 표현

 이진 트리 순회

 이진 트리의 성질

 이진트리 응용: 수식 트리

 트리 연산

 스레드 이진트리

 이진탐색트리

(3)

트리(TREE)

 리스트, 스택, 큐 등은 선형 구조

 트리: 계층적인 구조를 나타내는 자료구조

(4)

트리

 트리(tree)란?

계층적 구조를 나타내는 자료구조

부모-자식 관계의 노드들로 구성

(5)

트리

 트리 응용 분야

계층적인 조직 표현

파일 시스템

인공지능의 결정트리(decision tree) 등

대표이사

총무부 영업부 생산부

(6)

트리 정의

 형식적 정의

한 개 이상의 노드들로 구성

루트(root)라는 특정 노드 존재 (부모가 없는 노드)

나머지 노드들은 T1, T2, …, Tn으로 분할

T1, T2, …, Tn은 루트의 서브 트리라 한다. (재귀적 정의)

각 서브 트리는 disjoint 집합

T1

T2

T3

(7)

트리 용어

 루트(root): 부모가 없는 노드

 서브 트리(subtree):

 간선(edge):노드간의 연결 선

 단말 노드 또는 잎노드(terminal/leaf): 차수가 0인 노드

 비 단말노드(non terminal): 단말 노드 이외의 노드들

 자식 노드(child node): 노드 X의 서브 트리의 루트들은 X

A

B C D

E F G H I J

(8)

트리 용어(2)

 조상 노드(ancestor node): 루트부터 노드에 이르는 경로 상의 모든 노드들

 자손 노드(descendent node): 서브 트리상의 모든 노드들

 노드의 차수(degree): 서브 트리의 개수

 트리의 차수: 트리에 속한 노드의 최대 차수

 수준(level): 트리의 각 층에 매겨지는 번호, 루트의 레 벨은 1, 한 층씩 내려갈수록 1씩 증가

 높이(height) 또는 깊이(depth): 트리에 속한 노드의 최

A

B C D

E F G H I J

(9)

트리 표현

 일반적으로 트리를 리스트로 표현

노드의 차수에 따라 링크 수가 다름

노드 크기가 일정하지 않으면 복잡함

B

A

D

E F

C

G

A

B C D

F

E G

(10)

이진 트리

 이진 트리(binary tree)의 정의

공집합이거나

루트와 왼쪽 서브트리와 오른쪽 서브트리로 구성 되며, 각 서브트리는 이진트리이다. (순환적 정 의에 유의)

 이진 트리와 일반 트리간의 차이점

자식 노드 개수의 제한성

공백 유무

서브트리간에 순서 존재 여부

(11)

예제

 이진 트리 예

루트 노드?

잎 노드?

중간 노드?

차수가 1인 노드는?

트리 높이?

트리 차수?

B

A

C

D E F G

H I

(12)

편향 이진트리

 왼편 또는 오른편으로 편향되어 있는 트리

(skewed binary tree)

(13)

이진트리의 특징

 n개 노드를 가진 이진 트리가 갖는 간선의 개수는?

B

A

C

D E F G

(14)

이진트리의 특징 (2)

 높이가 h인 이진 트리는

최소 몇 개의 노드를 갖는가?

최대 몇 개의 노드를 갖는가?

B

A

C

D E F G

(15)

이진 트리의 특징 (3)

 N개의 노드를 갖는 이진 트리의 높이는?

최대 높이는?

최소 높이는?

B

A

C

D E F G

(16)

이진 트리의 종류

 포화 이진트리(full binary tree)

각 트리 수준에 노드가 꽉 차 있는 이진트리

트리 수준 단위로 왼쪽부터 오른쪽의 순서로 번 호 부여

 완전 이진트리(complete binary tree)

트리 높이가 k일 때, 수준 1부터 k-1까지 노드가 모두 채워지고,

마지막 수준 k에서, 왼쪽부터 오른쪽의 순서로 노드가 채워지는 이진트리

(17)

예제

(18)

이진트리의 표현

 배열 표현

 링크 이용

(19)

배열 표현

(20)

예제: 배열 표현

(21)

배열 표현 (2)

 부모와 자식노드 간의 인덱스 관계

 노드의 인덱스가 i일 때,

부모 노드 인덱스:

왼쪽 자식 노드 인덱스:

오른쪽 자식 노드 인덱스:

(22)

링크 이용

 트리에서 노드를 구조체로 표현하고 , 각 노드 의 링크가 자식 노드를 가리키게 하는 방법

 노드의 구조체 표현

typedef struct TreeNode { int data;

데이터

왼쪽 자식노드 오른쪽 자식노드

(23)

예제: 링크 이용

(24)

이진트리 순회

 이진트리 순회(traversal)란?

트리에 포함된 모든 노드를 방문하는 것

 이진트리 순회 방법은 루트, 왼쪽 서브트리, 오른쪽 서브트리 중에서 루트를 언제 방문하는 가에 따라서 구분

전위(preorder)

중위(inorder)

후위(postorder)

(25)

전위 순회

 전위 순회(preorder traversal)는 다음의 순 서로 노드를 방문.

루트 노드 방문

왼쪽 서브트리 방문

오른쪽 서브트리 방문

 다음 트리를 전위 순회하면?

B

A

C

D E F G

H I

(26)

전위 순회 알고리즘

 알고리즘 (순환적)

B

A

C

D E F G

H I

preorder(T) {

}

(27)

중위 순회

 중위 순회(inorder traversal)는 다음의 순 서로 노드를 방문.

왼쪽 서브트리 방문

루트 노드 방문

오른쪽 서브트리 방문

 다음 트리를 중위 순회하면?

B

A

C

D E F G

H I

(28)

중위 순회 알고리즘

B

A

C

D E F G

H I

inorder(T) {

}

(29)

후위 순회

 후위 순회(postorder traversal)는 다음의 순 서로 노드를 방문.

왼쪽 서브트리 방문

오른쪽 서브트리 방문

루트 노드 방문

 다음 트리를 후위 순회하면?

B

A

C

D E F G

H I

(30)

후위 순회 알고리즘

B

A

C

D E F G

H I

postorder(T) {

}

(31)

트리 순회 반복적 버전

 트리 순회의 반복적 버전은 스택을 이용

 중위 순회 고려

B

A

C

D E F G

(32)

중위 순회 반복적 버전 (분석)

void inorder_iter(TreeNode *root) { // 스택 이용

TreeNode* curr = root;

1. currr가 NULL이 아니면 curr 기준으로 트리의

가장 왼쪽 노드에 이를 때까지 노드를 스택에 저장 2. 스택에서 노드 node를 가져와서 출력

3. curr <- node->right 4. 위의 과정을 반복 }

}

B

A

C

D E F G

(33)

중위 순회 반복적 버전 알고리즘

void inorder_iter(TreeNode *root) { // 스택 이용

TreeNode* curr = root;

while (curr != NULL || !is_empty(s)) {

while (curr != NULL) {//가장 왼쪽 노드까지 push(&s, curr);

curr = curr->left;

}

curr = pop(&s);

print(curr);

// curr과 좌측 서브트리는 방문 상태 // 이제 우측 서브트리를 방문할 순서

B

A

C

(34)

트리 수준별 순회

 트리의 수준별 순회(level order)란?

트리의 낮은 수준부터 높은 수준의 순서로 방문 하되, 같은 수준에 있는 노드들을 좌측에서 우측 의 순서로 모두 방문하는 순회

 다음 트리를 수준별로 순회하면?

B

A

C

D E F G

(35)

예제: 트리 수준별 순회

 큐를 이용

(36)

트리 수준별 순회 알고리즘

level_order(T) {

initQueue(q); // 큐 q 초기화

if (T != NULL) then enqueue(q, T);

}

//NULL은 큐에 삽입하지 않는다.

B

A

C

D E F G

(37)

후위 순회 응용

 자식을 먼저 처리하고, 부모 노드를 처리해 야 할 경우에 선택

 예: 디렉토리 용량 계산, 수식 트리 계산 등

(38)

이진 트리 응용

 수식 트리

 디렉토리 용량 계산

(39)

수식 트리

 수식 트리(expression tree)

산술식, 논리식의 연산자와 피연산자로 트리를 구성

피연산자는 잎노드에, 연산자는 비단말노드에 위치

왼쪽 서브트리는 왼쪽 피연산자를, 오른쪽 서브트리 는 오른쪽 피연산자를 표현

(40)

수식 트리 표현 및 평가

 다음 수식 트리를 평가하라.

/

typedef union {

int operand;

char operator;

} element;

typedef struct TreeNode {

(41)

수식 트리 평가 알고리즘

 수식트리가 이항 연산자만 포함한다고 가정 eval(T)

{ // T: null, 피연산자, 연산 노드

(42)

디렉토리 용량 계산

 디렉토리의 용량을 계산에 사용되는 트리 순

회는?

(43)

디렉토리 용량 계산

int calc_dir_size(TreeNode *root) {

// 디렉토리 용량은 다음을 더해서 계산 1. 현재 디렉토리 용량

2. 왼쪽 서브디렉토리 용량

3. 오른쪽 서브디렉토리 용량

}

참조

관련 문서

본 클러스터는 터미널 서버를 통해 각 노드의 serial 콘솔을 관리 한다 이를 위해.. 노드 리눅스

연결리스트에서 마지막 노드가 끝 노드를 가리키게하며 리스트의 포인터를 맨끝 노드를 가리킨다. (2) 임의의 노드의 앞뒤 작업을 편리하게 하기위한 이중 연결리스트

[9]은 노드에 연결된 child 노드의 수와 연결 가능한 최대 child 노드 수를 DIO를 통해 전달하고, DIO를 받 은 child 노드들이 preferred parent 노드를 선택할 때 최대 child 노드

DocumentType DTD를 지원할 수 있도록 DTD의 entity와 notation에 접근하는 인터페이스 Node XML 문서의 모든 노드를 정의하는 인터페이스 NodeList

본 논문에서는 효율적인 트래픽관리와 노드의 수명을 고려한 경로 설정을 위해 퍼지 시스템을 사용하여 메시지 전달경로를 설정하는 방법을 제안한다.. 이후 이웃 노드 중

NamedNodeMap 노드의 이름을 통해 노드를 다룰 수 있도록 하는 인터페이스 Element XML문서의 엘리먼트 노드를 정의하는 인터페이스.. Attr XML문서의 어트리뷰트

통신장애가 발생하게 되면 통신장애 그룹의 자식 노드 는 통신장애 그룹의 부모 노드에게 센서 데이터를 전송 할 수 없다. 이 경우 통신장애 그룹의 자식 노드에서는

본 연구에서의 시스템은 GPS를 노드 별로 내장함으 로서 이동 노드의 경우 실외에서는 GPS를 이용하여 별도의 고정 노드 없이 위치 인식이 가능하도록 하였 고,