1.37k likes | 2.04k Views
제 6 장 트 리. 트 리 이진 트리 확장 이진 트리 (2- 트리 ) 허프만 트리 이진 트리 순회 스레드 이진 트리 이진 탐색 트리 힙 토너먼트 트리 집합의 표현.
E N D
제 6장 트 리 • 트 리 • 이진 트리 • 확장 이진 트리(2-트리) • 허프만 트리 • 이진 트리 순회 • 스레드 이진 트리 • 이진 탐색 트리 • 힙 • 토너먼트 트리 • 집합의 표현
1 트 리1.1 트리의 정의- 계층 구조를 갖는 자료들을 유용하게 표현1 (Rooted) 트리는 다음 성질을 만족하는 하나 이상의 노드들의 유한 집합 ① 루트라는 하나의 노드가 반드시 존재 ② 나머지 노드들은 n(≥0)개의 분리된 집합 T1, T2, …, Tn 으로 분할 T1, T2, …, Tn는 트리이며, 이를 부트리(subtree)라 함
1 10개의 노드를 갖는 트리 ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ- 트리와 관련된 용어 정의
1.2 트리의 표현(1) 리스트 표현- 루트 노드에 있는 정보가 먼저 나오고, 다음으로 그 루트 노드의 부트리들이 뒤따라 나오도록 하는 리스트로 표현→ 부트리들을 구별하기 위해 괄호를 사용 <예> ( a ( b ( d, e, f ( i, j ) ), c (g , h ) ) )- 트리를 메모리 내부 표현·연결 리스트를 사용하는 방법
트리를 메모리 내부 표현·연결 리스트를 사용하는 방법·자료와 자식들의 포인터를 필드로 갖는 노드에 의해 트리의 노드들을 표현하는 방법
① 가변길이노드사용 → 노드길이 : 자식의 수에 따라 결정 → 알고리즘이 복잡 ② 고정길이노드사용 → 노드길이 : 트리의 차수, 모든 노드가 동일 → 알고리즘이 간단, 기억공간의 낭비 → k-차원 트리를 표현하기 위한 노드 구조
(2) 왼쪽 자식 - 오른쪽 형제 표현- 트리의 각 노드가 두개의 포인터 필드를 링크로 갖도록 변환하여 트리를 표현하는 방법
-<예> a a b c b c d e f g h d e f g h i j i j
(3) 차수가 2인 트리를 시계 방향으로 45도 회전 a a b b c d c d e f g h e g f h i j i j
2 이진 트리2.1 이진 트리의 정의2이진 트리(binary tree)는 다음 성질을 만족하는 노드들의 유한 집합① 공백이거나,② 루트 노드와 서로 분리된 두개의 이진 트리, 즉 왼쪽 부트리와 오른쪽 부트리로 구성- 이진 트리와 트리의 차이점
-<예> 다음 두 이진 트리는 서로 다른 이진 트리가 됨·사향 이진 트리(skewed binary tree) :루트를 제외한 모든 노드가 그 부모의 왼쪽 자식이거나 모든 노드가 그 부모의 오른쪽 자식인 이진 트리 a a b b
·완전 이진 트리(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
이진 트리의 기본 성질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 이라고 가정
→ 레벨 (i-1)에서 최대 노드 수는 2i-2 → 각 노드의 최대 차수는 2 → 레벨 i 에서 최대 노드 수는 레벨 (i-1)에서 최대 노드 수의 두 배 → 2i-2×2=2i-1② (레벨 i의 최대 노드 수) =2 n0=n2+1 n0 : 단말 노드 수 n2 : 차수가 2인 노드 수
[증명] n1 : 차수가 1인 노드 수n : 전체 노드 수B : 전체 가지(branch) 수n=n0+n1+n2 n=B+1(루트 노드) B=n1+2n2 n=n1+2n2+1 → n0=n2+1
깊이가 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)보다 크거나 같은 최소 정수인
2.2 이진 트리의 표현(1) 배열을 사용한 표현- 포화 이진 트리(full binary tree)의 번호 메김·루트에서 시작하여 레벨이 증가하는 방향으로,·같은 레벨에서는 왼쪽 노드에서 오른쪽 노드로 ·정수 1부터 시작하여 차례로 양의 정수를 각 노드의 번호로 부여- 이진 트리의 노드들은 그 위치에 따라 포화 이진 트리의 노드들로 1:1 사상
[1] [1] [2] [3] [2] [3] [6] [7] [4] [5] [6] [7]
이진 트리는 1-차원 배열을 사용하여 표현 가능·각 노드의 자료는 그 노드의 일련 번호에 해당하는 배열의 위치에 저장·루트 노드를 1로 번호 메김 하므로 배열의 0번째 공간은 표현의 편의상 사용하지 않음
[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
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
[증명]· ①은 ②, ③에 의해 당연히 성립하고· ③은 ②에 의해 쉽게 유도될 수 있으므로 ②가 성립함을 보인다.· ②를 i에 관한 귀납법으로 증명i=1이고 2≤n일 때, 왼쪽 자식은 2에 있고, 2>n일때 왼쪽 자식을 갖지 않음 i/2 i 2i 2i+1
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
깊이가 k인 사향 이진 트리(skewed binary tree)를 배열로 표현할 경우 필요한 공간 : (2k-1)사용된 공간 : k → 기억공간의 낭비 초래(2) 연결 리스트를 사용한 표현- 이진 트리를 배열로 표현·완전 이진 트리(complete binary tree) → 효율적·일반 이진 트리 → 기억 공간의 낭비
→ 노드의 삽입과 삭제를 위해 많은 자료 이동이 필요- 연결 리스트로 표현·노드 : LeftChild, data, RightChild 등의 세 개의 필드로 구성·두 개의 구조체를 사용Tree 구조체 : 이진 트리의 루트 노드에 대한 포인터를 유지TreeNode 구조체 : 트리의 노드 구조를 정의
struct TreeNode{ TreeNode *LeftChild; char data; TreeNode *RightChild; }; struct Tree{ TreeNode *root; }; ·단점 : 부모 노드 결정이 어려움(a)TreeNode구조
Tree Tree TreeNode (b)연결 리스트를 사용하여 표현한 이진 트리 root root
3 확장 이진 트리(2-트리)○ 확장 이진 트리(extended binary tree) 또는 2-트리- 각 노드가 자식을 갖지 않거나 두개의 자식을 갖는 이진 트리- 2-트리의 노드 ·내부 노드(internal node) : 두 개의 자식을 갖는 노드, 원으로 표시·외부 노드(external node) : 자식을 갖지 않은 노드,사각형으로 표시
이진 트리의 2-트리로 변환(a) 이진 트리 (b) 확장 이진 트리(2-트리)
2-트리의 성질· ne=ni+1 ni : 내부 노드 개수ne : 외부 노드 개수- 2-트리의 응용 : ·내부 노드가 테스트, 외부 노드가 어떤 동작을 나타내는 경우의 알고리즘을 표현하는데 사용·이러한 알고리즘의 수행시간은 트리 내의 노드들의 경로 길이에 의존·경로 길이① 내부 경로 길이(li) : 루트 노드에서 모든 내부 노드까지 경로 길이의 합
② 외부 경로 길이(le) : 루트 노드에서 모든 외부 노드까지 경로 길이의 합·n개의 내부 노드를 갖는 2-트리에서 외부 경로 길이와 내부 경로 길이의 관계le=li+2n· 2-트리가 n개의 외부 노드를 갖고 각 외부 노드에 가중치(weight)가 부여된 경우 가중 경로 길이 W의정의wk : 외부 노드 nk의 가중치lk : 외부 노드 nk의 루트 노드로부터의 경로 길이
4가중치가 2, 3, 5, 11을 갖는 다음 2-트리 (a), (b), (c)의 가중 경로 길이 (a) (b) (c) 2 11 2 3 5 11 11 5 2 3 3 5
[풀이] (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개의 외부 노드 각각을 하나의 트리로 간주 ② 이들 중 가중치가 가장 작은 두 개의 트리를 선택
③ 새로운 노드를 만들어 가장 작은 가중치를 갖는 트리를 왼쪽 자식으로 두 번째로 작은 가중치를 갖는 트리를 오른쪽 자식으로 하는 하나의 트리를 생성 → 생성된 트리의 가중치= 왼쪽 부트리와 오른쪽 부트리의 가중치의 합④ 위의 과정을 한 개의 트리가 될 때까지 반복·허프만 알고리즘에 의해 생성된 트리 : 허프만 트리(Huffman tree) → 최소 가중 경로 길이를 갖는 2-트리
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
허프만 트리의 응용·가변 길이를 갖는 허프만 코드를 구하는데 이용→ 메시지 내의 각 문자들이 나타나는 확률이 가중치로 주어졌을 때→ 출현 확률이 높은 문자 : 짧은 코드를 할당→ 확률이 낮은 문자 : 보다 긴 코드를 할당→ 문자들에 대한 평균 코드 길이를 최소가 되도록 한 코드 체계·허프만 코드 구하는 알고리즘 ① 허프만 트리를 구성
② 루트 노드에서 각 외부 노드까지 경로를 따라가면서 부모 노드의 왼쪽 자식에 0을 오른쪽 자식에 1을 순서대로 덧붙여 허프만 코드를 생성·전위 코드(prefix code) 각 문자의 코드가 다른 문자 코드의 앞부분(prefix)에 포함되지 않은 코드 → 연속된 메시지 비트열에서 문자의 해독이 매우 용이 → 허프만 코드는 전위 코드가 됨
6문자, 출현 확률, 코드가 다음과 같을 때 <코드-1>로 수신된 메시지 001010011와 <코드-2>로 수신된 메시지 1101001을 해독[풀이] <코드-1>과 <코드-2>는 모두 어떤 코드가 다른 코드를 그 앞부분으로 포함하고 있지 않기 때문에 쉽게 해독이 가능
코드-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
.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
허프만 알고리즘을 요약void Huffman() { while(트리군 내에 두개 이상의 트리가 존재){ i = 가장 작은 가중치를 갖는 트리군(Forest) 내의 트리 인덱스; j = 두 번째로 작은 가중치를 갖는 트리군(Forest) 내의 트리 인덱스; 왼쪽 자식이 Forest[i]의 루트이고, 오른쪽 자식이오른쪽 자식이Forest[j]의 루트인 새로운 노드 생성;
트리군 내의 트리 i를 새로 생성된 노드를 루트로 갖고, 가중치가 원래의 트리 i와 트리 j의 가중치의 합인 트리로 대치;트리군 내에서 트리 j를 제거; }- 자료 구조 ① 허프만 트리의 노드 구조
·parent : 단말 노드에서 루트까지 경로를 찾아가면서 문자에 대한 코드를 구하기 위해필요② 코드화 하고자 하는 문자들에 대한 단말 노드, 가중치, 심볼 등을 포함하는 테이블의 레코드 구조 ③ 트리군 내의 각 트리들을 나타내기 위한 레코드 구조
프로그램의 수행 과정HuffTree (a)초기상태 Forest character
HuffTree d a (b)한번 반복 후의 상태 Forest character
5 이진 트리 순회○ 이진 트리의 순회(traversal) - 트리 내의 각 노드를 정확히 한번씩 방문·중위(inorder) 순회 : LVR·후위(postorder) 순회 : LRV·전위(preorder) 순회 : VLR중위 순회 : bac전위 순회 : abc후위 순회 : bca a b c
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