56
Chap. 10 : Tree 2007학년도 2학기 [email protected]

Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) [email protected]. 개요

Embed Size (px)

Citation preview

Page 1: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap. 10 : Tree

2007학년도 2학기

[email protected]

Page 2: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 2 [email protected]

1. 개 요재귀(recursion)의 정의, 순환~ 정의하고 있는 개념 자체에 대한 정의 내부에 자기 자신이 포함

되어 있는 경우를 의미

~ 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법

~ 정의자체가 순환적으로 되어 있는 경우에 적합한 방법

~ 예제)

팩토리얼 값 구하기

피보나치 수열

이항계수

하노이의 탑

이진탐색

Page 3: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 3 [email protected]

1. 개 요트리(Tree)~ 계층적인 구조를 나타내는 비선형(Non-linear) 자료구조

~ 트리는 부모-자식 관계의 노드로 구성

~ 응용분야

계층적인 조직 표현

파일 시스템

인공지능에서의 결정 트리

Page 4: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 4 [email protected]

트리 자료구조를 사용하는 이유 ?~ 다른 자료구조와 달리 비선형 구조.

~ 정렬된 배열

탐색은 빠르지만 O(logN), 삽입/삭제는 느림 (O(N)).

~ 연결리스트

삽입/삭제는 빠르지만 (O(1)), 탐색은 느림 (O(N)).

~ 트리

삽입과 삭제, 탐색이 모두 빠름 (O(logN)).

Page 5: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 5 [email protected]

2. 트리에서 사용하는 용어경로(path)~ 어떤 한 노드에서 다른 노드까지 링크를 통해 이동했을 때, 거쳐

온 노드들의 집합.

루트(root)~ 트리의 가장 상위에 있는 노드로 루트는 항상 하나만 존재한다.

부모, 자식(parent, children)~ 링크로 연결된 노드 중 위에 있는 노드를 부모 노드, 아래 있는

노드를 자식 노드라 한다.

키(key)~ 자료 항목을 찾거나 또는 다른 동작을 하기 위해 필요한 값

~ 각 자료 항목을 구분해주는 역할, 자료 항목을 대표하는 값

Page 6: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 6 [email protected]

하위트리(subtree)

~ 하나의 큰 트리에 속해있는 부분트리.

방문(visiting)

~ 노드에 도착해 노드의 자료 값을 읽는 행위.

순회(traversing)

~ 트리의 노드 전체를 방문하는 행위.

레벨(level)

~ 어떤 노드의 레벨은 루트노드로부터 얼마나 많이 떨어졌는지를 의미

~ 여기에서는 루트를 레벨 1로 가정.

높이(height)

~ 높이는 최장 루트-잎 경로의 길이이다.

Page 7: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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

Page 8: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 8 [email protected]

Page 9: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 9 [email protected]

3. 트리의 일반적인 성질한 노드에서 다르 노드로 가는 경로가 유일~ 임의의 두 노드에 대해 최소 공통 선조 (least common

ancestor)를 갖음.

두 노드가 가질 수 있는 가장 가까운 선조

~ 경로가 중복되지 않는다면 두 노드간의 경로는 반드시 한 노드에서 최소 공통 선조까지 올라갔다 다른 노드로 내려오는 유일한경로만이 존재.

N개의 노드를 갖는 트리는 N-1개의 링크.~ 그래프와 달리 루트를 제외하고는 모든 노드가 자신의 선조를 향

한 하나의 링크를 가지고 있음.

~ N개의 노드를 가진 트리는 N-1개의 링크를 갖음.

Page 10: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 10 [email protected]

4. 이진 트리이진 트리(binary tree)~ 트리 구조 중 자식을 최대 둘까지 가질 수 있는 트리

~ 모든 노드의 차수가 2 이하

구현하기가 편리함

~ 모든 노드가 2개의 서브 트리를 가지고 있는 트리

~ 서브 트리는 공집합일 수 있음.

~ 이진 트리에는 서브 트리간의 순서가 존재

~ 각 노드들은 자식이 없거나, 하나 또는 두 개의 자식 노드를 유지

~ 가장 보편적인 트리 구조, 이진 탐색 트리(binary search tree)

Page 11: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 11 [email protected]

4.1 생김새특징~ 왼쪽 자식(left child), 오른쪽 자식(right child).

~ 왼쪽 자식의 키(key)는 부모노드의 키보다 작고, 오른쪽 자식의키는 부모노드의 키보다 크다.

Page 12: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 12 [email protected]

노드의 개수가 n개이면 간선의 개수는 n-1

Page 13: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 13 [email protected]

높이가 h인 이진 트리~ 최소 h개의 노드

~ 최대 2h-1개의 노드

Page 14: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 14 [email protected]

n개의 노드를 가지는 이진 트리의 높이~ 최대 n, 최소 log2(n+1)

Page 15: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 15 [email protected]

완전 이진 트리(complete binary tree)~ 마지막 레벨을 제외한 각 레벨의 노드들이 모두 차있고, 마지막

레벨에서는 노드들이 순서대로 존재하는 상태

꽉 찬 이진 트리(full binary tree)~ 모든 레벨이 꽉 찬 이진v트리

Page 16: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 16 [email protected]

Page 17: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 17 [email protected]

4.2 이진 트리 구현배열 표현법~ 모든 이진트리를 포화 이진트리라고 가정

~ 각 노드에 번호 부여, 그 번호를 배열의 인덱스

Page 18: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 18 [email protected]

링크 표현법~ 포인터를 이용하여 부모노드가 자식노드를 가리키게 하는 방법

Page 19: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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(‘[‘);

}

}

Page 20: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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)

{ … }

}

Page 21: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 21 [email protected]

4.3 트리 순회(traverse)순회(traversal)~ 트리의 노드들을 체계적으로 방문하는 것

순회 방법~ 전위 순회(preorder traversal), VLR

~ 자손 노드보다 루트 노드를 먼저 방문.

~ 중위 순회(inorder traversal), LVR

~ 왼쪽 자손, 루트, 오른쪽 자손 노드 순서로 방문.

~ 후위 순회(postorder traversal), LRV

~ 루트 노드보다 자손 노드를 먼저 방문.

Page 22: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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 ); // 오른쪽서브트리 순회

}

}

Page 23: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 23 [email protected]

Page 24: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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 );// 오른쪽서브트리 순회

}

}

Page 25: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 25 [email protected]

+

* /

a b c d

1

2

3

5

6

7

8

Page 26: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 26 [email protected]

Page 27: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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 ); // 노드 방문

}

}

Page 28: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 28 [email protected]

Page 29: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 29 [email protected]

수식 트리수식 트리(evalaution tree)~ 산술식을 트리 형태로 표현한 것

비단말노드: 연산자(operator)

단말노드: 피연산자(operand)

Page 30: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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수식

Page 31: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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;

}

Page 32: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 32 [email protected]

특징~ 탐색작업을 효율적으로 하기 위한 자료구조

~ key(왼쪽서브트리)≤key(루트노드)≤key(오른쪽서브트리)

~ 이진탐색를 중위순회하면 오름차순으로 정렬.

Page 33: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 33 [email protected]

알고리즘~ 비교한 결과가 같으면 탐색 성공.

~ 주어진 키 값이 루트 노드의 키값보다 작으면 탐색은 이 루트 노드의 왼쪽 자식을 기준으로 다시 시작.

~ 주어진 키 값이 루트 노드의 키값보다 크면 탐색은 이 루트 노드의 오른쪽 자식을 기준으로 다시 시작.

Page 34: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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);

Page 35: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 35 [email protected]

Page 36: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 36 [email protected]

최대값과 최소값 탐색~ 현 노드보다 작은 값은 왼쪽 자식에, 큰 값은 오른쪽 자식에 위치

~ 최소값은 트리의 가장 왼쪽에, 최대값은 트리의 가장 오른쪽에존재

~ 루트에서 왼쪽 자식을 따라 내려가면서 더 이상 왼쪽 자식이 없는 노드를 만나면 그 노드가 최소값을 가진 노드

~ 최대값은 오른쪽 자식을 따라가면 찾을 수 있다.

Page 37: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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;

}

Page 38: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 38 [email protected]

Page 39: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 39 [email protected]

4.5 이진 트리에서 삽입방법~ 노드가 삽입될 위치 탐색.

~ 적절한 경로를 따라 내려간 뒤 그 위치의 부모가 되는 노드 탐색

~ 삽입될 위치의 부모노드의 키보다 삽입될 노드의 키가 작다면 부모노드의 왼쪽 자식으로, 크다면 부모노드의 오른쪽 자식으로 생성.

Page 40: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 40 [email protected]

Page 41: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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

Page 42: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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;

} } } } }

Page 43: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 43 [email protected]

4.5 이진 트리에서 삭제3가지의 경우

~ 삭제하려는 노드가 단말 노드일 경우

~ 삭제하려는 노드가 하나의 왼쪽이나 오른쪽 서브 트리중 하나만가지고 있는 경우

삭제하려는 노드의 자식 노드가 하나일 때

~ 삭제하려는 노드가 두개의 서브 트리 모두 가지고 있는 경우

삭제하려는 노드의 자식 노드가 둘일 때

Page 44: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

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;}

Page 45: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 45 [email protected]

~ 단말 노드의 부모 노드를 찾아서 연결을 삭제(null)

Page 46: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 46 [email protected]

2. 삭제하려는 노드의 자식이 하나일 때

~ 삭제하려는 노드의 자식노드와 부모노드를 바로 연결.

Page 47: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 47 [email protected]

Page 48: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 48 [email protected]

3. 삭제하려는 노드의 자식이 둘일 때

~ 삭제하려는 노드의 자식 중 하나로 그 위치를 대체할 수 없음

~ 삭제될 노드의 위치를 채워줄 후보 노드 선정.

후보 노드(candidate node)~ 삭제될 노드의 키 값보다 바로 위의 키 값을 가진 노드나 바로 아

래의 키 값을 가진 값을 후보 노드로 선택.

Page 49: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 49 [email protected]

후보 노드 선정 1~ 삭제될 노드보다 큰 값을 갖는 (오른쪽) 서브 트리 선택.

~ 서브 트리에서 가장 작은 값을 갖는 노드를 후보 노드로 지정.

Page 50: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 50 [email protected]

후보 노드 선정 2~ 삭제될 노드보다 작은 값을 갖는 (왼쪽) 서브 트리 선택.

~ 서브 트리에서 가장 큰 값을 갖는 노드를 후보 노드로 지정.

Page 51: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 51 [email protected]

삭제하려는 노드의 자식이 둘일 때~ 잘못된 대체의 예

Page 52: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 52 [email protected]

후보노드가 삭제 노드의 오른쪽 자식일 경우~ 부모 노드에서 삭제 노드에 대한 링크 절단

~ 후보 노드로 링크를 연결.

~ 삭제 노드의 왼쪽 자식은 삭제 노드와의 링크 절단, 후보 노드의왼쪽 자식으로 링크.

Page 53: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 53 [email protected]

후보노드가 삭제노드의 오른쪽 자식의 왼쪽 자손일 경우~ 후보노드의 오른쪽 자식

후보노드의 부모노드에 대한 왼쪽 자식 노드로 저정

~ 삭제노드의 오른쪽 자식

후보노드의 오른쪽 자식으로 지정.

~ 부모노드에서 삭제노드에 대한 링크 절단, 후보노드로 연결

~ 삭제노드의 왼쪽 자식

삭제노드와의 링크를 끊고 후보노드의 왼쪽 자식으로 연결

Page 54: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 54 [email protected]

Page 55: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 55 [email protected]

Page 56: Chap. 10 : Tree - Programming Languages & Compiler …compiler.sangji.ac.kr/lecture/ds/2007_2/chap10_tree.pdf ·  · 2014-10-07Chap 10. 트리(Tree) kkman@sangji.ac.kr-2-1. 개요

Chap 10. 트리(Tree) - 56 [email protected]

4.7 효율성특징~ 트리 연산은 하위 레벨로의 탐색을 포함.

~ 꽉 찬 트리에서 노드의 반 정도가 맨 아래 레벨에 존재.

~ 노드들에 대한 연산(삽입, 삭제 등)은 최하위 레벨에 있는 노드까지 찾는 연산을 필요로 함

~ 탐색하는 동안 최소한 하나의 레벨에 하나의 노드를 방문

~ 어떠한 연산을 하는데 걸리는 시간은 트리의 레벨에 따라 유추

노드의 수를 N, 레벨의 수를 L~ L = log2(N + 1)