Upload
dangdang
View
224
Download
4
Embed Size (px)
Citation preview
Chap 10. 트리(Tree) - 2 [email protected]
1. 개 요재귀(recursion)의 정의, 순환~ 정의하고 있는 개념 자체에 대한 정의 내부에 자기 자신이 포함
되어 있는 경우를 의미
~ 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법
~ 정의자체가 순환적으로 되어 있는 경우에 적합한 방법
~ 예제)
팩토리얼 값 구하기
피보나치 수열
이항계수
하노이의 탑
이진탐색
Chap 10. 트리(Tree) - 3 [email protected]
1. 개 요트리(Tree)~ 계층적인 구조를 나타내는 비선형(Non-linear) 자료구조
~ 트리는 부모-자식 관계의 노드로 구성
~ 응용분야
계층적인 조직 표현
파일 시스템
인공지능에서의 결정 트리
Chap 10. 트리(Tree) - 4 [email protected]
트리 자료구조를 사용하는 이유 ?~ 다른 자료구조와 달리 비선형 구조.
~ 정렬된 배열
탐색은 빠르지만 O(logN), 삽입/삭제는 느림 (O(N)).
~ 연결리스트
삽입/삭제는 빠르지만 (O(1)), 탐색은 느림 (O(N)).
~ 트리
삽입과 삭제, 탐색이 모두 빠름 (O(logN)).
Chap 10. 트리(Tree) - 5 [email protected]
2. 트리에서 사용하는 용어경로(path)~ 어떤 한 노드에서 다른 노드까지 링크를 통해 이동했을 때, 거쳐
온 노드들의 집합.
루트(root)~ 트리의 가장 상위에 있는 노드로 루트는 항상 하나만 존재한다.
부모, 자식(parent, children)~ 링크로 연결된 노드 중 위에 있는 노드를 부모 노드, 아래 있는
노드를 자식 노드라 한다.
키(key)~ 자료 항목을 찾거나 또는 다른 동작을 하기 위해 필요한 값
~ 각 자료 항목을 구분해주는 역할, 자료 항목을 대표하는 값
Chap 10. 트리(Tree) - 6 [email protected]
하위트리(subtree)
~ 하나의 큰 트리에 속해있는 부분트리.
방문(visiting)
~ 노드에 도착해 노드의 자료 값을 읽는 행위.
순회(traversing)
~ 트리의 노드 전체를 방문하는 행위.
레벨(level)
~ 어떤 노드의 레벨은 루트노드로부터 얼마나 많이 떨어졌는지를 의미
~ 여기에서는 루트를 레벨 1로 가정.
높이(height)
~ 높이는 최장 루트-잎 경로의 길이이다.
Chap 10. 트리(Tree) - 7 [email protected]
노드(node)~ 트리의 구성요소
루트(root)~ 부모가 없는 노드(A)
서브트리(subtree)~ 하나의 노드와 그 노드들의 자
손들로 이루어진 트리
단말노드(leaf node)~ 자식이 없는 노드(A,B,C,D)
비단말노드~ 적어도 하나의 자식을 가지는
노드(E,F,G,H,I,J)
레벨(level)~ 트리의 각층의 번호
높이(height)~ 트리의 최대 레벨(3)
차수(degree)~ 노드가 가지고 있는 자식 노드
의 개수
A
B C D
E F G H I J
Chap 10. 트리(Tree) - 8 [email protected]
Chap 10. 트리(Tree) - 9 [email protected]
3. 트리의 일반적인 성질한 노드에서 다르 노드로 가는 경로가 유일~ 임의의 두 노드에 대해 최소 공통 선조 (least common
ancestor)를 갖음.
두 노드가 가질 수 있는 가장 가까운 선조
~ 경로가 중복되지 않는다면 두 노드간의 경로는 반드시 한 노드에서 최소 공통 선조까지 올라갔다 다른 노드로 내려오는 유일한경로만이 존재.
N개의 노드를 갖는 트리는 N-1개의 링크.~ 그래프와 달리 루트를 제외하고는 모든 노드가 자신의 선조를 향
한 하나의 링크를 가지고 있음.
~ N개의 노드를 가진 트리는 N-1개의 링크를 갖음.
Chap 10. 트리(Tree) - 10 [email protected]
4. 이진 트리이진 트리(binary tree)~ 트리 구조 중 자식을 최대 둘까지 가질 수 있는 트리
~ 모든 노드의 차수가 2 이하
구현하기가 편리함
~ 모든 노드가 2개의 서브 트리를 가지고 있는 트리
~ 서브 트리는 공집합일 수 있음.
~ 이진 트리에는 서브 트리간의 순서가 존재
~ 각 노드들은 자식이 없거나, 하나 또는 두 개의 자식 노드를 유지
~ 가장 보편적인 트리 구조, 이진 탐색 트리(binary search tree)
Chap 10. 트리(Tree) - 11 [email protected]
4.1 생김새특징~ 왼쪽 자식(left child), 오른쪽 자식(right child).
~ 왼쪽 자식의 키(key)는 부모노드의 키보다 작고, 오른쪽 자식의키는 부모노드의 키보다 크다.
Chap 10. 트리(Tree) - 12 [email protected]
노드의 개수가 n개이면 간선의 개수는 n-1
Chap 10. 트리(Tree) - 14 [email protected]
n개의 노드를 가지는 이진 트리의 높이~ 최대 n, 최소 log2(n+1)
Chap 10. 트리(Tree) - 15 [email protected]
완전 이진 트리(complete binary tree)~ 마지막 레벨을 제외한 각 레벨의 노드들이 모두 차있고, 마지막
레벨에서는 노드들이 순서대로 존재하는 상태
꽉 찬 이진 트리(full binary tree)~ 모든 레벨이 꽉 찬 이진v트리
Chap 10. 트리(Tree) - 16 [email protected]
Chap 10. 트리(Tree) - 17 [email protected]
4.2 이진 트리 구현배열 표현법~ 모든 이진트리를 포화 이진트리라고 가정
~ 각 노드에 번호 부여, 그 번호를 배열의 인덱스
Chap 10. 트리(Tree) - 18 [email protected]
링크 표현법~ 포인터를 이용하여 부모노드가 자식노드를 가리키게 하는 방법
Chap 10. 트리(Tree) - 19 [email protected]
노드 클래스 in Java노드 클래스~ 노드의 키값이 저장될 공간과 두 자식에 대한 참조 변수로 구성
class Node {
public int keyData;
public Node leftChild;
public Node rightChild;
public void showNode() {
System.out.print(‘[‘);
System.out.print(keyData);
System.out.print(‘[‘);
}
}
Chap 10. 트리(Tree) - 20 [email protected]
트리 클래스 in Java
class BinaryTree {
private Node root;
public void tracerse()
{ … }
public Node find(int key)
{ … }
public void insert(int key)
{ … }
public boolean delete(int key)
{ … }
…
}
Chap 10. 트리(Tree) - 21 [email protected]
4.3 트리 순회(traverse)순회(traversal)~ 트리의 노드들을 체계적으로 방문하는 것
순회 방법~ 전위 순회(preorder traversal), VLR
~ 자손 노드보다 루트 노드를 먼저 방문.
~ 중위 순회(inorder traversal), LVR
~ 왼쪽 자손, 루트, 오른쪽 자손 노드 순서로 방문.
~ 후위 순회(postorder traversal), LRV
~ 루트 노드보다 자손 노드를 먼저 방문.
Chap 10. 트리(Tree) - 22 [email protected]
전위 순회전위 순회 (Preorder Traverse)~ 루트를 먼저 방문하는 순회방법
1. 루트 노드 방문.
2. 왼쪽 하위 트리 방문.
3. 오른쪽 하위 트리 방문.
// 전위 순회
preorder( TreeNode *root ){
if ( root ){
printf("%d", root->data ); // 노드 방문
preorder( root->left ); // 왼쪽서브트리 순회
preorder( root->right ); // 오른쪽서브트리 순회
}
}
Chap 10. 트리(Tree) - 23 [email protected]
Chap 10. 트리(Tree) - 24 [email protected]
중위 순회중위 순회 (Inorder Traverse)~ 왼쪽 서브트리->루트->오른쪽 서브트리 순서로 방문
1. 왼쪽 하위 트리 방문.
2. 노드를 방문.
3. 오른쪽 하위 트리 방문.
// 중위 순회
inorder( TreeNode *root ){
if ( root ){
inorder( root->left );// 왼쪽서브트리 순회
printf("%d", root->data ); // 노드 방문
inorder( root->right );// 오른쪽서브트리 순회
}
}
Chap 10. 트리(Tree) - 26 [email protected]
Chap 10. 트리(Tree) - 27 [email protected]
후위 순회후위 순회 (Postorder Traverse)~ 루트->왼쪽서브트리->오른쪽서브트리 순으로 방문
1. 왼쪽 하위트리 방문.
2. 오른쪽 하위 트리 방문.
3. 노드 방문.
// 후위 순회
postorder( TreeNode *root ){
if ( root ){
postorder( root->left );// 왼쪽서브트리 순회
postorder( root->right );// 오른쪽서브트리순회
printf("%d", root->data ); // 노드 방문
}
}
Chap 10. 트리(Tree) - 28 [email protected]
Chap 10. 트리(Tree) - 29 [email protected]
수식 트리수식 트리(evalaution tree)~ 산술식을 트리 형태로 표현한 것
비단말노드: 연산자(operator)
단말노드: 피연산자(operand)
Chap 10. 트리(Tree) - 30 [email protected]
a b < c d < ora b c × -a b +후위순회
a < b or c < da - b × ca + b중위순회
or < a b < c d- a × b c+ a b전위순회
(a < b) or (c < d)a - (b × c)a + b수식
Chap 10. 트리(Tree) - 31 [email protected]
4.4 이진 트리 탐색탐색(search)~ 어떤 주어진 키를 가지고 그 키와 동일한 값을 갖는 노드를 찾는
것.
~ 루트노드부터 방문하여 노드의 키 값과 주어진 키 값을 비교하여내려가는 식으로 진행.
Public Node find(int key) {
Node current = root;
while (current.keyData != key) {
if (current == null) return null;
if (key < current.keyData)
current = current.leftChild;
else
current = current.rightChild;
}
return current;
}
Chap 10. 트리(Tree) - 32 [email protected]
특징~ 탐색작업을 효율적으로 하기 위한 자료구조
~ key(왼쪽서브트리)≤key(루트노드)≤key(오른쪽서브트리)
~ 이진탐색를 중위순회하면 오름차순으로 정렬.
Chap 10. 트리(Tree) - 33 [email protected]
알고리즘~ 비교한 결과가 같으면 탐색 성공.
~ 주어진 키 값이 루트 노드의 키값보다 작으면 탐색은 이 루트 노드의 왼쪽 자식을 기준으로 다시 시작.
~ 주어진 키 값이 루트 노드의 키값보다 크면 탐색은 이 루트 노드의 오른쪽 자식을 기준으로 다시 시작.
Chap 10. 트리(Tree) - 34 [email protected]
search(x, k)
if x=NULL
then return NULL;
if k=x->key
then return x;
else if k<x->key
then return search(x->left, k);
else return search(x->right, k);
Chap 10. 트리(Tree) - 35 [email protected]
Chap 10. 트리(Tree) - 36 [email protected]
최대값과 최소값 탐색~ 현 노드보다 작은 값은 왼쪽 자식에, 큰 값은 오른쪽 자식에 위치
~ 최소값은 트리의 가장 왼쪽에, 최대값은 트리의 가장 오른쪽에존재
~ 루트에서 왼쪽 자식을 따라 내려가면서 더 이상 왼쪽 자식이 없는 노드를 만나면 그 노드가 최소값을 가진 노드
~ 최대값은 오른쪽 자식을 따라가면 찾을 수 있다.
Chap 10. 트리(Tree) - 37 [email protected]
pubilc Node findMin()
{
Node current = root;
while (current.leftChild != null)
current = current.leftChild;
return current;
}
public Node findMax()
{
Node current = root;
while (current.rightChild != null)
current = current.rightChild;
return current;
}
Chap 10. 트리(Tree) - 38 [email protected]
Chap 10. 트리(Tree) - 39 [email protected]
4.5 이진 트리에서 삽입방법~ 노드가 삽입될 위치 탐색.
~ 적절한 경로를 따라 내려간 뒤 그 위치의 부모가 되는 노드 탐색
~ 삽입될 위치의 부모노드의 키보다 삽입될 노드의 키가 작다면 부모노드의 왼쪽 자식으로, 크다면 부모노드의 오른쪽 자식으로 생성.
Chap 10. 트리(Tree) - 40 [email protected]
Chap 10. 트리(Tree) - 41 [email protected]
BT insert in C
insert_node(T,z)
p←NULL;
t←root;
while t≠NULL do
p←t;
if z->key < p->key
then t←p->left;
else t←p->right;
if p=NULL
then root←z;// 트리가 비어있음
else if z->key < p->key
then p->left←z
else p->right←z
Chap 10. 트리(Tree) - 42 [email protected]
BT insert in Javapublic void insert(int key) {
Node insertNode = new Node();insertNode.keyData = key;
if (root == null) root = insertNode;else {
Node current = root, parent;while(true) {
parent = current;if (key < current.keyData) {
current = current.leftChild;if (current == null) {
parent.leftChild = insertNode;return;
} }else {
current = current.rightChild;if (current == null) {
parent.rightChild = insertNode;return;
} } } } }
Chap 10. 트리(Tree) - 43 [email protected]
4.5 이진 트리에서 삭제3가지의 경우
~ 삭제하려는 노드가 단말 노드일 경우
~ 삭제하려는 노드가 하나의 왼쪽이나 오른쪽 서브 트리중 하나만가지고 있는 경우
삭제하려는 노드의 자식 노드가 하나일 때
~ 삭제하려는 노드가 두개의 서브 트리 모두 가지고 있는 경우
삭제하려는 노드의 자식 노드가 둘일 때
Chap 10. 트리(Tree) - 44 [email protected]
1. 삭제하려는 노드의 자식이 없을 때, 단말 노드 삭제~ 삭제 노드의 부모 노드에게서 삭제 노드를 가리키는 링크를 null
If (current.leftChild == null && current.rightChild == null) {if (current == root)
root = null;else if (current == parent.leftChild)
parent.leftChild = null;else
parent.rightChild = null;}
Chap 10. 트리(Tree) - 45 [email protected]
~ 단말 노드의 부모 노드를 찾아서 연결을 삭제(null)
Chap 10. 트리(Tree) - 47 [email protected]
Chap 10. 트리(Tree) - 48 [email protected]
3. 삭제하려는 노드의 자식이 둘일 때
~ 삭제하려는 노드의 자식 중 하나로 그 위치를 대체할 수 없음
~ 삭제될 노드의 위치를 채워줄 후보 노드 선정.
후보 노드(candidate node)~ 삭제될 노드의 키 값보다 바로 위의 키 값을 가진 노드나 바로 아
래의 키 값을 가진 값을 후보 노드로 선택.
Chap 10. 트리(Tree) - 49 [email protected]
후보 노드 선정 1~ 삭제될 노드보다 큰 값을 갖는 (오른쪽) 서브 트리 선택.
~ 서브 트리에서 가장 작은 값을 갖는 노드를 후보 노드로 지정.
Chap 10. 트리(Tree) - 50 [email protected]
후보 노드 선정 2~ 삭제될 노드보다 작은 값을 갖는 (왼쪽) 서브 트리 선택.
~ 서브 트리에서 가장 큰 값을 갖는 노드를 후보 노드로 지정.
Chap 10. 트리(Tree) - 51 [email protected]
삭제하려는 노드의 자식이 둘일 때~ 잘못된 대체의 예
Chap 10. 트리(Tree) - 52 [email protected]
후보노드가 삭제 노드의 오른쪽 자식일 경우~ 부모 노드에서 삭제 노드에 대한 링크 절단
~ 후보 노드로 링크를 연결.
~ 삭제 노드의 왼쪽 자식은 삭제 노드와의 링크 절단, 후보 노드의왼쪽 자식으로 링크.
Chap 10. 트리(Tree) - 53 [email protected]
후보노드가 삭제노드의 오른쪽 자식의 왼쪽 자손일 경우~ 후보노드의 오른쪽 자식
후보노드의 부모노드에 대한 왼쪽 자식 노드로 저정
~ 삭제노드의 오른쪽 자식
후보노드의 오른쪽 자식으로 지정.
~ 부모노드에서 삭제노드에 대한 링크 절단, 후보노드로 연결
~ 삭제노드의 왼쪽 자식
삭제노드와의 링크를 끊고 후보노드의 왼쪽 자식으로 연결
Chap 10. 트리(Tree) - 54 [email protected]
Chap 10. 트리(Tree) - 55 [email protected]
Chap 10. 트리(Tree) - 56 [email protected]
4.7 효율성특징~ 트리 연산은 하위 레벨로의 탐색을 포함.
~ 꽉 찬 트리에서 노드의 반 정도가 맨 아래 레벨에 존재.
~ 노드들에 대한 연산(삽입, 삭제 등)은 최하위 레벨에 있는 노드까지 찾는 연산을 필요로 함
~ 탐색하는 동안 최소한 하나의 레벨에 하나의 노드를 방문
~ 어떠한 연산을 하는데 걸리는 시간은 트리의 레벨에 따라 유추
노드의 수를 N, 레벨의 수를 L~ L = log2(N + 1)