1 / 136

제 6 장 트 리

제 6 장 트 리. 트 리 이진 트리 확장 이진 트리 (2- 트리 ) 허프만 트리 이진 트리 순회 스레드 이진 트리 이진 탐색 트리 힙 토너먼트 트리 집합의 표현.

brett-rojas
Download Presentation

제 6 장 트 리

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 제 6장 트 리 • 트 리 • 이진 트리 • 확장 이진 트리(2-트리) • 허프만 트리 • 이진 트리 순회 • 스레드 이진 트리 • 이진 탐색 트리 • 힙 • 토너먼트 트리 • 집합의 표현

  2. 1 트 리1.1 트리의 정의- 계층 구조를 갖는 자료들을 유용하게 표현1 (Rooted) 트리는 다음 성질을 만족하는 하나 이상의 노드들의 유한 집합 ① 루트라는 하나의 노드가 반드시 존재 ② 나머지 노드들은 n(≥0)개의 분리된 집합 T1, T2, …, Tn 으로 분할 T1, T2, …, Tn는 트리이며, 이를 부트리(subtree)라 함

  3. 1 10개의 노드를 갖는 트리 ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ- 트리와 관련된 용어 정의

  4. 1.2 트리의 표현(1) 리스트 표현- 루트 노드에 있는 정보가 먼저 나오고, 다음으로 그 루트 노드의 부트리들이 뒤따라 나오도록 하는 리스트로 표현→ 부트리들을 구별하기 위해 괄호를 사용 <예> ( a ( b ( d, e, f ( i, j ) ), c (g , h ) ) )- 트리를 메모리 내부 표현·연결 리스트를 사용하는 방법

  5. 트리를 메모리 내부 표현·연결 리스트를 사용하는 방법·자료와 자식들의 포인터를 필드로 갖는 노드에 의해 트리의 노드들을 표현하는 방법

  6. ① 가변길이노드사용 → 노드길이 : 자식의 수에 따라 결정 → 알고리즘이 복잡 ② 고정길이노드사용 → 노드길이 : 트리의 차수, 모든 노드가 동일 → 알고리즘이 간단, 기억공간의 낭비 → k-차원 트리를 표현하기 위한 노드 구조

  7. (2) 왼쪽 자식 - 오른쪽 형제 표현- 트리의 각 노드가 두개의 포인터 필드를 링크로 갖도록 변환하여 트리를 표현하는 방법

  8. -<예> a a b c b c d e f g h d e f g h i j i j

  9. (3) 차수가 2인 트리를 시계 방향으로 45도 회전 a a b b c d c d e f g h e g f h i j i j

  10. 2 이진 트리2.1 이진 트리의 정의2이진 트리(binary tree)는 다음 성질을 만족하는 노드들의 유한 집합① 공백이거나,② 루트 노드와 서로 분리된 두개의 이진 트리, 즉 왼쪽 부트리와 오른쪽 부트리로 구성- 이진 트리와 트리의 차이점

  11. -<예> 다음 두 이진 트리는 서로 다른 이진 트리가 됨·사향 이진 트리(skewed binary tree) :루트를 제외한 모든 노드가 그 부모의 왼쪽 자식이거나 모든 노드가 그 부모의 오른쪽 자식인 이진 트리 a a b b

  12. ·완전 이진 트리(complete binary tree) : 임의의 두 단말 노드의 레벨의 차이가 1이하이며, 왼쪽에서 오른쪽으로 채워진 이진 트리·포화 이진 트리(full binary tree) :각 레벨에 노드가 가득 차 있는 이진 트리(a)사향이진트리 (b)완전이진트리 (c)포화이진트리 a a a b b c b c c d e f g d e f g d h i h i j k l m n o e

  13. 이진 트리의 기본 성질1이진 트리는 다음 두가지 성질을 만족 ① 이진 트리의 레벨 i에서 최대 노드 수 = 2i-1, i≥1.② 깊이 k인 이진 트리의 최대 노드 수 = 2k-1, k≥1.[증명]① i에 관한 수학적 귀납법을 사용하여 증명i=1일 때, 루트 노드만 존재하므로 2i-1=21-1=20=1임으로 자명1≤j<i인 모든 j에 대해, 레벨 j에서 최대 노드 수가 2j-1 이라고 가정

  14. → 레벨 (i-1)에서 최대 노드 수는 2i-2 → 각 노드의 최대 차수는 2 → 레벨 i 에서 최대 노드 수는 레벨 (i-1)에서 최대 노드 수의 두 배 → 2i-2×2=2i-1② (레벨 i의 최대 노드 수) =2 n0=n2+1 n0 : 단말 노드 수 n2 : 차수가 2인 노드 수

  15. [증명] n1 : 차수가 1인 노드 수n : 전체 노드 수B : 전체 가지(branch) 수n=n0+n1+n2 n=B+1(루트 노드) B=n1+2n2 n=n1+2n2+1 → n0=n2+1

  16. 깊이가 k인 포화 이진 트리(full binary tree)의 노드 수 : 2k-1(k≥0)- 노드 수가 n인 완전 이진 트리의 깊이 2k-1-1<n≤2k-1 → 2k-1<n+1≤2k → k-1<log2(n+1)≤k → log2(n+1)≤k<log2(n+1)+1 → k는 정수값으로서 log2(n+1)보다 크거나 같은 최소 정수인

  17. 2.2 이진 트리의 표현(1) 배열을 사용한 표현- 포화 이진 트리(full binary tree)의 번호 메김·루트에서 시작하여 레벨이 증가하는 방향으로,·같은 레벨에서는 왼쪽 노드에서 오른쪽 노드로 ·정수 1부터 시작하여 차례로 양의 정수를 각 노드의 번호로 부여- 이진 트리의 노드들은 그 위치에 따라 포화 이진 트리의 노드들로 1:1 사상

  18. [1] [1] [2] [3] [2] [3] [6] [7] [4] [5] [6] [7]

  19. 이진 트리는 1-차원 배열을 사용하여 표현 가능·각 노드의 자료는 그 노드의 일련 번호에 해당하는 배열의 위치에 저장·루트 노드를 1로 번호 메김 하므로 배열의 0번째 공간은 표현의 편의상 사용하지 않음

  20. [1] [1] [1] [2] [2] [3] [3] [2] [3] [8][4] [7] [4] [5][6] [7] a a a b b c c b c d d e d e f g

  21. 3 n개의 노드를 갖는 이진 트리가 배열로 표현→ i(1≤i≤n)번째 노드의 부모, 왼쪽 자식, 오른쪽 자식 노드들은 다음 성질을 만족①parent(i) =부모 노드가 없음( 루트노드) , i=1 ②LeftChild(i) = 2i, 2i≤n왼쪽 자식 없음, 2i>n ③RightChild(i) = 2i+1, 2i+1≤ n오른쪽 자식없음, 2i+1 > n

  22. [증명]· ①은 ②, ③에 의해 당연히 성립하고· ③은 ②에 의해 쉽게 유도될 수 있으므로 ②가 성립함을 보인다.· ②를 i에 관한 귀납법으로 증명i=1이고 2≤n일 때, 왼쪽 자식은 2에 있고, 2>n일때 왼쪽 자식을 갖지 않음 i/2 i 2i 2i+1

  23. 1≤j≤i인 모든 j에 대해 ②가 성립함을 가정, 즉 LeftChild(j)=2j라 가정 → 2(i+1)≤n인 경우, LeftChild(i+1)=LeftChild(i)+2=2i+2=2(i+1) → 2(i+1)>n이라면, 왼쪽 자식을 갖지 않음 i i+1 g 2i 2i+1 2i+2

  24. 깊이가 k인 사향 이진 트리(skewed binary tree)를 배열로 표현할 경우 필요한 공간 : (2k-1)사용된 공간 : k → 기억공간의 낭비 초래(2) 연결 리스트를 사용한 표현- 이진 트리를 배열로 표현·완전 이진 트리(complete binary tree) → 효율적·일반 이진 트리 → 기억 공간의 낭비

  25. → 노드의 삽입과 삭제를 위해 많은 자료 이동이 필요- 연결 리스트로 표현·노드 : LeftChild, data, RightChild 등의 세 개의 필드로 구성·두 개의 구조체를 사용Tree 구조체 : 이진 트리의 루트 노드에 대한 포인터를 유지TreeNode 구조체 : 트리의 노드 구조를 정의

  26. struct TreeNode{ TreeNode *LeftChild; char data; TreeNode *RightChild; }; struct Tree{ TreeNode *root; }; ·단점 : 부모 노드 결정이 어려움(a)TreeNode구조

  27. Tree Tree TreeNode (b)연결 리스트를 사용하여 표현한 이진 트리 root root

  28. 3 확장 이진 트리(2-트리)○ 확장 이진 트리(extended binary tree) 또는 2-트리- 각 노드가 자식을 갖지 않거나 두개의 자식을 갖는 이진 트리- 2-트리의 노드 ·내부 노드(internal node) : 두 개의 자식을 갖는 노드, 원으로 표시·외부 노드(external node) : 자식을 갖지 않은 노드,사각형으로 표시

  29. 이진 트리의 2-트리로 변환(a) 이진 트리 (b) 확장 이진 트리(2-트리)

  30. 2-트리의 성질· ne=ni+1 ni : 내부 노드 개수ne : 외부 노드 개수- 2-트리의 응용 : ·내부 노드가 테스트, 외부 노드가 어떤 동작을 나타내는 경우의 알고리즘을 표현하는데 사용·이러한 알고리즘의 수행시간은 트리 내의 노드들의 경로 길이에 의존·경로 길이① 내부 경로 길이(li) : 루트 노드에서 모든 내부 노드까지 경로 길이의 합

  31. ② 외부 경로 길이(le) : 루트 노드에서 모든 외부 노드까지 경로 길이의 합·n개의 내부 노드를 갖는 2-트리에서 외부 경로 길이와 내부 경로 길이의 관계le=li+2n· 2-트리가 n개의 외부 노드를 갖고 각 외부 노드에 가중치(weight)가 부여된 경우 가중 경로 길이 W의정의wk : 외부 노드 nk의 가중치lk : 외부 노드 nk의 루트 노드로부터의 경로 길이

  32. 4가중치가 2, 3, 5, 11을 갖는 다음 2-트리 (a), (b), (c)의 가중 경로 길이 (a) (b) (c) 2 11 2 3 5 11 11 5 2 3 3 5

  33. [풀이] (a) W = 2·2 + 3·2 + 5·2 + 11·2 = 42 (b) W = 2·1 + 3·3 + 5·3 + 11·2 = 48 (c) W = 2·3 + 3·3 + 5·2 + 11·1 = 364 허프만 트리○ 최소 가중 경로 길이를 갖는 2-트리를 찾는 문제 ·허프만 알고리즘에 의해 해결·허프만 알고리즘 ① n개의 외부 노드 각각을 하나의 트리로 간주 ② 이들 중 가중치가 가장 작은 두 개의 트리를 선택

  34. ③ 새로운 노드를 만들어 가장 작은 가중치를 갖는 트리를 왼쪽 자식으로 두 번째로 작은 가중치를 갖는 트리를 오른쪽 자식으로 하는 하나의 트리를 생성 → 생성된 트리의 가중치= 왼쪽 부트리와 오른쪽 부트리의 가중치의 합④ 위의 과정을 한 개의 트리가 될 때까지 반복·허프만 알고리즘에 의해 생성된 트리 : 허프만 트리(Huffman tree) → 최소 가중 경로 길이를 갖는 2-트리

  35. 5외부 노드의 가중치가 2, 3, 5, 11일 때 최소 가중 경로 길이를 갖는 트리[풀이] (a) (b) (c) (d) 2 3 5 11 5 5 11 2 3 21 10 11 10 11 5 5 5 5 2 3 2 3

  36. 허프만 트리의 응용·가변 길이를 갖는 허프만 코드를 구하는데 이용→ 메시지 내의 각 문자들이 나타나는 확률이 가중치로 주어졌을 때→ 출현 확률이 높은 문자 : 짧은 코드를 할당→ 확률이 낮은 문자 : 보다 긴 코드를 할당→ 문자들에 대한 평균 코드 길이를 최소가 되도록 한 코드 체계·허프만 코드 구하는 알고리즘 ① 허프만 트리를 구성

  37. ② 루트 노드에서 각 외부 노드까지 경로를 따라가면서 부모 노드의 왼쪽 자식에 0을 오른쪽 자식에 1을 순서대로 덧붙여 허프만 코드를 생성·전위 코드(prefix code) 각 문자의 코드가 다른 문자 코드의 앞부분(prefix)에 포함되지 않은 코드 → 연속된 메시지 비트열에서 문자의 해독이 매우 용이 → 허프만 코드는 전위 코드가 됨

  38. 6문자, 출현 확률, 코드가 다음과 같을 때 <코드-1>로 수신된 메시지 001010011와 <코드-2>로 수신된 메시지 1101001을 해독[풀이] <코드-1>과 <코드-2>는 모두 어떤 코드가 다른 코드를 그 앞부분으로 포함하고 있지 않기 때문에 쉽게 해독이 가능

  39. 코드-1 : 001010011 = bcd코드-2 : 1101001 = bcd-<예> 허프만 코드를 구하기b c e a b c d e d a (a) 초기 상태 (b) a와 d의 합병 .40 .15 .25 .12 .40 .15 .08 .25 .20 .08 .12

  40. .35 .40 .25 .60 .40 b e bc e d a c (c)a,d와 c의 합병d a (d)a,c,d와 e의 합병a : 1111b b : 0e c : 110 d : 1110 c e : 10 (e)허프만트리 (f)허프만 코드 .20 .35 .15 .25 .20 .08 .12 .15 .08 .12 1.00 .60 .40 .35 .25 .20 .15 .08 .12

  41. 허프만 알고리즘을 요약void Huffman() { while(트리군 내에 두개 이상의 트리가 존재){ i = 가장 작은 가중치를 갖는 트리군(Forest) 내의 트리 인덱스; j = 두 번째로 작은 가중치를 갖는 트리군(Forest) 내의 트리 인덱스; 왼쪽 자식이 Forest[i]의 루트이고, 오른쪽 자식이오른쪽 자식이Forest[j]의 루트인 새로운 노드 생성;

  42. 트리군 내의 트리 i를 새로 생성된 노드를 루트로 갖고, 가중치가 원래의 트리 i와 트리 j의 가중치의 합인 트리로 대치;트리군 내에서 트리 j를 제거; }- 자료 구조 ① 허프만 트리의 노드 구조

  43. ·parent : 단말 노드에서 루트까지 경로를 찾아가면서 문자에 대한 코드를 구하기 위해필요② 코드화 하고자 하는 문자들에 대한 단말 노드, 가중치, 심볼 등을 포함하는 테이블의 레코드 구조 ③ 트리군 내의 각 트리들을 나타내기 위한 레코드 구조

  44. 프로그램의 수행 과정HuffTree (a)초기상태 Forest character

  45. HuffTree d a (b)한번 반복 후의 상태 Forest character

  46. 5 이진 트리 순회○ 이진 트리의 순회(traversal) - 트리 내의 각 노드를 정확히 한번씩 방문·중위(inorder) 순회 : LVR·후위(postorder) 순회 : LRV·전위(preorder) 순회 : VLR중위 순회 : bac전위 순회 : abc후위 순회 : bca a b c

  47. 5.1 순환 알고리즘을 사용한 이진 트리 순회

  48. 7 이진 트리 순회 트리 T : L : 왼쪽 부트리 R : 오른쪽 부트리[풀이]① 중위 순회(LVR) : d, b, e, a, c, f② 전위 순회(VLR) : a, b, d, e. c, f③ 후위 순회(LRV) : d, e, b, f, c, a a c b f d e

More Related