31
이산수학 10. 트리 1

10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

10장. 트리

1

Page 2: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

출처

본 강좌 자료는 이산수학 (2학년 / 3학점/ 3시간 / 이론) 수업에서

사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

아카데미 출판사] 의 내용 등을 출처로 작성하였음을 알리는 바입니다.

2

Page 3: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

학습목표

■ 비선형자료구조의 트리에 대한 기본 개념 이해

■ 이진트리를 이용한 컴퓨터의 수식표현 이해

■ 이진트리를 이용한 데이터 압축방법 이해

3

Page 4: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

학습내용

■ 트리 개념

■ 이진트리의 성질

■ 이진트리 구현

■ 이진트리 순회

■ 이진트리 활용

4

Page 5: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

Tree

■ 비순환, 연결 그래프

■ 루트 노드는 반드시 한나 존재

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

■ 자료들 간에 1:多 관계 비선형 자료구조

■ 자료들 간에 계층형 자료구조

■ 응용분야

◻ 계층 구조 표현

◻ 파일 시스템

◻ 인공지능의 결정 트리

5

Page 6: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

Tree 용어(1)

■ 노드 (node) : 트리를 구성하는 정점

■ 루트노드(root) : 트리의 시작 노드

■ 간선(branch) : 부모노드와 자식 노드 관계의 연결선

■ 단말노드(leaf): 자식노드가 없는 노드

■ 형제노드(siblings) : 동일한 부모노드를 갖는 노드들

■ 조상노드(parent): 현재 노드부터 루트노드까지 경로에 있는 모든

노드들

■ 서브트리(subtree): 부모노드와 연결된 간선을 끊었을 때 생성되는

트리

6

Page 7: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

Tree 용어(2)

■ 자손노드: 현재노드의 서브트리에 있는 모든 노드들

■ 차수(degree)

◻ 노드의 차수: 노드에 연결된 자식 노드의 수

◻ 트리의 차수 : 트리에 있는 노드의 차수 중에서 가장 큰 값

■ 노드의 레벨(level) : 루트노드와 현재노드를 연결하는 간선의 수

■ 높이(height)

◻노드의 높이: 노드의 레벨

◻트리의 높이: 트리의 차수

7

Page 8: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

예제

■ 트리의 높이 : 4

■ B노드의 레벨: 1

■ 트리의 차수: 4

■ 루트노드 : A

■ D노드의 자손 노드: H, I, M

8

Page 9: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

수학적 귀납법 증명

■ 0을 포함한 자연수 𝒏에 관한 명제 𝒑(𝒏)가 모든 자연수 𝒏 에 대하여

성립하는 것을 다음 세 단계의 과정으로 증명하는 방법

1. 기본 가정: 초기값 𝒊 에 대해 명제 𝒑(𝒊) 가 참임을 증명.

2. 귀납 가정 : 임의의 자연수 𝒌 에 대해 명제 𝒑(𝒌) 가 참이라고 가정.

3. 귀납 단계: 귀납가정에서 사용한 자연수보다 큰 자연수 𝒌 + 𝟏 에

대해서도 명제 𝒑(𝒌 + 𝟏) 이 성립함을 증명.

9

Page 10: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

트리 노드와 간선의 관계

(정리) 트리 𝑇 의 노드의 개수를 𝑛, 간선의 개수를 𝑒라고 할 때, 𝑒 = 𝑛 − 1이다.

(증명) 수학적 귀납법 증명. 𝑝 𝑛 : 𝑒 = 𝑛 − 1

(1) 𝑛 = 1일 때, 𝑒 = 0 성립 ∴ 0 = 1 − 1

2 임의의 자연수 𝑘에 대하여 𝑛 < 𝑘일 때, 𝑝 𝑛 : 𝑒 = 𝑛 − 1가 참이라고 하자.

(3) Let 𝑛 = 𝑘 . 𝑤. 𝑡. 𝑠 𝑝 𝑘 : 𝑒 = 𝑘 − 1.

트리 𝑇 에서 임의의 간선 한 개를 제거하면 두 개의 서브트리 𝑇1 과 𝑇2 가 존재.

트리 𝑇 , 𝑇1 과 𝑇2 에 대한 노드의 수: 𝑣 𝑇 , 𝑣 𝑇1 , 𝑣(𝑇2).

각 트리에 대한 간선의 수 : 𝑒 𝑇 , 𝑒 𝑇1 , 𝑒(𝑇2).

∴ 𝑒 = 𝑒 𝑇 = 𝑒 𝑇1 + 𝑒 𝑇2 + 1 = 𝑣 𝑇1 − 1 + 𝑣 𝑇2 − 1 + 1 = 𝑣 𝑇1 +𝑣 𝑇2 − 1 = 𝑉 𝑇 − 1 = k − 1

10

Page 11: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

예제

■ 노드의 수가 18개인 트리에 존재하는 간선의 수?

■ 간선의 수가 20개인 트리에 존재하는 노드의 수?

(풀이)

(1) 𝑒 = 𝑛 − 1=> 𝑒 = 18 − 1 = 17

(2) 𝑛 = 𝑒 + 1 => 𝑛 = 𝑒 + 1 =20+1=21

11

Page 12: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리(binary tree)

■ 이진트리

◻트리의 자식노드 구조를 일정하게 정의하여 트리의 구현과

연산을 쉽게 정의

◻ 부모 노드와 자식 노드 수와의 관계 ☞ 1:2

◻ 0 ≤ 노드의 차수 ≤ 2

■ 이진트리의 순환적 구성

◻노드의 왼쪽 자식노드를 루트로 하는 왼쪽 서브트리도 이진트리

◻노드의 오른쪽 자식노드를 루트로 하는 오른쪽 서브트리도

이진트리

12

Page 13: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 종류(1)

■ 포화 이진트리

◻ 이진트리의 레벨 𝑘에 대한 노드 개수는 2𝑘 .

◻ 이진트리의 높이 ℎ에 대한 노드 개수는 (2ℎ+1 − 1)

◻ 루트노드를 1번으로 하여 2ℎ+1 − 1 까지 정해진 위치에 대한

노드 번호 지정

13

Page 14: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 종류(2)

■ 편향 이진트리

◻ 이진트리의 높이 ℎ에 대한 노드 개수는 (ℎ+1).

◻ 한쪽 방향의 자식 노드만을 가진 이진 트리

14

Page 15: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 종류(3)

■ 완전 이진트리

◻ 이진트리의 높이가 ℎ , 노드 수가 𝑛개일 때 ℎ+1 ≤ 𝑛 < 2ℎ+1 − 1

◻ 포화 이진트리의 노드 번호 1부터 n까지 공백노드가 없다

◻ 높이가 ℎ 일 때 레벨 1부터 ℎ -1까지 모든 노드가 두 개씩

존재하며 레벨 ℎ 는 왼쪽부터 노드가 채워져 있는 트리

13 14 15

H

8

I

9

J

10

K

11

L

12

D

4

E

5

F

6

G

7

B

2

C

3

A

1

15

Page 16: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 성질(1)

■ 이진트리의 레벨 𝑘 에서 가질 수 있는 최대 노드 수는 2𝑘 개

(증명) 수학적 귀납법 증명. P 𝑘 : 2𝑘 이라 하자.

(1) 레벨 𝑘 = 0 일 때, 최대 노드의 수는 1. ∴ 1 = 20

2 레벨 𝑘 = 𝑛 일 때, p 𝑛 : 2𝑛 이 성립한다고 가정하자.

(3) 레벨 𝑘 = 𝑛 + 1일 때, w. t. s 𝒑 𝑛 + 1 : 2𝑛+1 .

귀납 가정 (2)와 이진트리의 노드의 최대 차수는 2이므로 레벨이

𝑛 + 1 일 때 최대 노드 수는 2 ∙ 2𝑛 = 2𝑛+1 .

16

Page 17: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 성질(2)

■ 높이가 ℎ 인 이진트리의 최대 노드 수는 2ℎ+1 − 1 개

(증명) 수학적 귀납법 증명

(1) 높이 ℎ = 0 일 때 레벨이 0 이므로 최대 노드 수는 1 = 20+1 −1.

(2) 높이 ℎ = 𝑛 일 때, 최대 노드 수는 2𝑛+1 − 1개 가정.

(3) 높이 ℎ = 𝑛 + 1일 때, w.t.s 2(𝑛+1)+1 − 1 개

귀납적 가정(2)에 의해 높이 𝑛 일 때의 최대 노드 수는 2𝑛+1 −1.

정리 1에 의해 레벨 𝑛 + 1 에서 가질 수 있는 최대 노드 수는 2𝑛+1.

높이가 𝑛 + 1 일 때, 최대 노드 수는 다음과 같다.

∴ 2𝑛+1 − 1 + 2𝑛+1 = 2 ∙ 2𝑛+1 − 1 = 2𝑛+2 − 1 = 2 𝑛+1 +1 − 1.

17

Page 18: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 성질(3)

■ 높이가 ℎ 인 이진 트리가 가질 수 있는 최소 노드 수는 ℎ + 1.

(증명) 수학적 귀납법 증명

(1) 높이 ℎ = 0 일 때, 노드 수는 1=0 + 1 = 1 .

(2) 높이 ℎ = 𝑛일 때, 최소 노드 수는 𝑛 + 1 개라고 가정하자.

(3) 높이 ℎ = 𝑛 + 1일 때, w.t.s. 최소 노드 수: 𝑛 + 1 + 1

∵ 귀납적 가정 (2)와 레벨 𝑛 + 1 에는 최소 하나의 노드가 존재해야 하므로 높이 𝑛 + 1 일 때의 최소 노드의 수는 𝑛 + 1 + 1.

18

Page 19: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

예제

■ 전체 노드의 수가 66개인 완전 이진 트리의 높이는?

(풀이)

높이 ℎ일 때 이진 트리의 최대 노드수 : 2ℎ+1 − 1.

∵ 63 = 25+1−1 < 66 < 26+1−1 = 127

∴ ℎ=6.

19

Page 20: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 구현 (1차원 배열)

■ 1차원 배열의 순차 자료구조 사용

■ 높이가 ℎ 인 포화 이진 트리의 노드번호를 배열의 인덱스로 사용

◻인덱스 0 : 실제로 사용하지 않고 비워둔다.

◻인덱스 1 : 루트노드를 저장

■ 배열의 인덱스 규칙을 사용하여 특정 노드 탐색 용이

■ 편향이진 트리인 경우 메모리 낭비 발생

■ 트리의 노드 삽입/삭제에 대한 배열의 크기 변경 어려움

20

Page 21: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 구현 (단순 연결리스트)

■ 단순 연결리스트로 구현한 이진 트리

■ 메모리 낭비 해결

■ 부모 노드와 자식 노드간에 주소(포인터)로 연결

■ 삽입 삭제 용이

■ 주소 영역 변경만으로 노드 삽입 삭제 가능

■ 연결리스트의 노드 구성

21

Page 22: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리 순회(binary tree traversal)

■ 이진트리 순회 종류

◻ 중위순회, 전위순회, 후위순회

■ 이진트리 순회 작업

◻ 현재 노드를 방문하여 데이터를 읽기

◻ 현재 노드의 왼쪽 서브트리로 이동

◻ 현재 노드의 오른쪽 서브트리로 이동

■ 이진트리 순회 방식

◻ 서브트리에 대해서 순환적으로 반복하여 순회

◻ 왼쪽 서브트리 순회를 오른쪽 서브트리 순회보다 먼저 수행.

22

Page 23: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 후위 순회 재귀알고리즘

■ 이진트리 후위순회(tree postorder traversal)

◻ 이진트리의 모든 노드를 루트노드보다 자손노드를 먼저 방문

postorder( TreeNode *root ){

if ( root ){

postorder( root->left );

postorder( root->right );

printf("%d", root->data );

} }

23

Page 24: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

산술식 이진트리( arithmetic expression tree)

■ 산술식(이항연산자로 표현) : 피연산자 연산자 피연산자

■ 산술식 표기

◻Infix : 4*5, 4*3+2^3

◻Prefix(polish): *45, +*43^23

◻Postfix: 45*, 43*23^+

■ 산술식 이진트리

◻leaf노드: 피연산자

◻Internal 노드: 연산자

◻서브트리 계산->루트노드로 연결

4 3

*

+

^

3 2

24

Page 25: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

산술식 이진트리의 후위표기 계산기 알고리즘

■ 이진트리 후위순회를 사용

◻ internal노드를 방문할 때 양쪽 서브트리의 값을 저장된 연산자를 이용하여 계산한다

◻서브트리의 값을 재귀호출로 계산

function eval(root){

if(root is leaf) //피연산자

return leaf;

else { //recursive (연산자)

op1<- eval(root.left)

op2<- eval(root.right)

operator<-root

return (op1,op2,operator)

}

} 25

Page 26: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

문제

■ 산술식 트리에 대한 후위표기식을 계산하여라.

* -

2 1 7 8

+

12*78-+

26

Page 27: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

이진트리의 활용: 데이터 압축(Huffman coding)

■ 파일의 문자 데이터 표현: ASCII코드 사용하여 문자 발생빈도에 상관없이 언제나 동일한 용량을 사용

■ reduce the number of bits (that are required by a character) needed to send or store a message.

■ as little space as possible

■ binary codes by using a binary tree

■ “lossless data compression”

■ Idea: 파일 안에 있는 문자의 발생 빈도에 따라 데이터 압축

◻ 발생 빈도가 높은 문자에는 적은 비트를 할당

◻ 발생 빈도가 낮은 문자에는 많은 비트를 할당

27

Page 28: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

Huffman coding 알고리즘

I. 발생 빈도가 가장 낮은 두 문자를 순차적으로 비교 선택하여 하나의 이진 트리 연결

I. 왼쪽 노드: 빈도수가 낮은 문자, 오른쪽 노드: 빈도수가 높은 문자 설정

(빈도수가 동일한 두 문자인 경우는 사전식 오름차순으로 나열)

II. 위의 두 문자 노드을 연결한 루트 노드는 두 문자의 빈도수의 합으로 표시

III. 문자들을 이진 트리로 연결하는 것을 최우선적으로 작업하고, 그 후에 생성된

이진 트리들을 연결

II. 위의 과정을 모든 문자가 하나의 이진 트리로 묶일 때까지 반복

III. 생성된 이진 트리의 왼쪽 노드에는 0, 오른쪽 노드에는 1을 할당 (허프만 이진트리)

IV. 문자노드를 루트부터 해당 문자까지 할당된 이진코드을 순서대로 나열 (허프만 코드)

28

Page 29: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

문제

■ 허프만 코드을 사용하여 표에 주어진 텍스트을 인코딩/디코딩하기

Character freq Huffman

code ②

③ Encode: ‘ABCBE’ ④ Decode:

1011001000011101

A 1 000 00001100111 C11001000011101

B 6 01 CE001000011101

C 7 10 CED000011101

D 2 001 CEDA011101

E 8 11 CEDABEB

① 허프만 이진 트리 구축

A:1

B:6

C:7

D:2

E:8

3

9 15

24 0

1 0

1

0

0

1

1

29

Page 30: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

데이터 압축에 사용한 문자 인코딩 평균 bits길이

■ avglength = 𝟏

𝒇 𝑻 × ( 𝒅 𝒊 × 𝒇(𝒊)𝒏

𝟏 )

◻ 𝑛 : 텍스트 파일에 있는 서로 다른 문자의 수

◻ 𝒇 𝑻 : 서로 다른 전체 문자의 출현 빈도수

◻ 𝒇(𝒊) : 문자 𝒊 의 출현 빈도수

◻ 𝒅 𝒊 : 문자 𝒊 에 대한 허프만 코드의 길이

■ Ex: 평균 문자 인코딩 bits길이= 𝟏

𝟏+𝟔+𝟕+𝟐+𝟖 × 𝟑 ∗ 𝟏 + 𝟐 ∗ 𝟔 + 𝟐 ∗ 𝟕 + 𝟑 ∗ 𝟐 + 𝟐 ∗ 𝟖 = 2.125 digits long

30

Page 31: 10장 트리 - contents.kocw.netcontents.kocw.net/KOCW/document/2015/shinhan/kimeuhee/10.pdf · 사용한 교재 [이산수학 (수학으로 이해하는 디지털 논리), 한빛

이산수학

문제

■ 다음과 같은 텍스트를 허프만 코드을 이용하여 인코딩 및 디코딩을

하시오.

Mississippi River

31