슬라이드 1

Similar documents
슬라이드 1

슬라이드 1

슬라이드 1

7장

08장.트리

Microsoft PowerPoint - lec07_tree [호환 모드]

Microsoft PowerPoint - chap10_tree

Ch.1 Introduction

o 경로 (path) 트리에서사용하는용어 ~ 어떤한노드에서다른노드까지링크를통해이동했을때, 거쳐온노드들의집합. o 루트 (root) ~ 트리의가장상위에있는노드로루트는항상하나만존재 o 부모, 자식 (parent, children) ~ 링크로연결된노드중위에있는노드를부모노드,

chap 5: Trees

chap 5: Trees

제 1 장 기본 개념

입학사정관제도

05_tree

Microsoft PowerPoint - 제8장-트리.pptx

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

e-비즈니스 전략 수립

Chapter 08. 트리(Tree)

Microsoft PowerPoint - 자료구조2008Chap07

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - 제9장-트리의응용.pptx

Microsoft PowerPoint - 6장 탐색.pptx

정의 이진탐색트리 이진탐색트리 (BST: binary search tree) 는각각의노드가 BST 특성을만족하는키 - 주소쌍을가지고있는이진트리 BST 특성 트리에있는각각의키에대해, 왼쪽서브트리에있는모든키는이것보다작고, 오른쪽서브트리에있는모든키는이것보다큼 < > 2

슬라이드 1

제 11 장 다원 탐색 트리

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

11장 포인터

Chapter 4. LISTS

슬라이드 1

ABC 10장

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Lab 3. 실습문제 (Single linked list)_해답.hwp

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

Chapter 4. LISTS

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

1장. 리스트

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

Microsoft PowerPoint - Chap5 [호환 모드]

PowerPoint 프레젠테이션

Chap 6: Graphs

OCW_C언어 기초

슬라이드 1

03_queue

슬라이드 1

06장.리스트

슬라이드 1

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

4.1 관계

슬라이드 1

1장. 리스트

Algorithms

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

PowerPoint 프레젠테이션

5 장 트 리

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 제목 없음

02장.배열과 클래스

Microsoft PowerPoint - chap04-연산자.pptx

11장 포인터

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - 07-chap05-Stack.ppt

Microsoft PowerPoint - Chap5 [호환 모드]

슬라이드 1

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

01장.자료구조와 알고리즘

쉽게 배우는 알고리즘 강의노트

1장. 리스트

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

C 언어 강의노트

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

Microsoft PowerPoint - chap-11.pptx

금오공대 컴퓨터공학전공 강의자료

슬라이드 1

슬라이드 1

슬라이드 1

중간고사 (자료 구조)

untitled

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

CH06)자료구조.hwp

o 스택 (stack) ~ 쌓아놓은더미 1. 스택의개요 - 2 -

Microsoft PowerPoint - 08-Queue.ppt

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - 제11장 포인터

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

PowerPoint 프레젠테이션

adfasdfasfdasfasfadf

2002년 2학기 자료구조

슬라이드 1

Microsoft PowerPoint - chap10-함수의활용.pptx

untitled

Transcription:

Data Structure Chapter 7. 트리 Dong Kyue Kim Hanyang University dqkim@hanyang.ac.kr

트리의개념

트리 (Tree) 트리 : 계층적인구조를나타내는자료구조 리스트, 스택, 큐등은선형구조 정의 (1) 하나의루트 (root) 노드 (2) 다수의서브트리 (subtree) 트리는부모-자식관계의노드들로이루어짐 응용분야 계층적인조직표현 컴퓨터디스크의디렉토리구조 인공지능에서의결정트리 (decision tree) 3

트리예시 - 회사의조직 대표이사 총무부 영업부 생산부 총무부영업부생산부 전산팀구매팀경리팀생산1 팀생산2 팀 4

트리예시 파일디렉토리구조 나의문서 받은파일음악그림 정지영상 동영상 5

트리의용어 노드 (node) : 트리의구성요소 루트 (root) : 부모가없는노드 (A) 서브트리 (subtree) : 하나의노드와그노드들의자손들로이루어진트리 A 루트 B C D E F G H I J 서브트리서브트리서브트리 6

트리의용어 단말노드 (terminal node) : 자식이없는노드 (E, F G, H, I, J) 비단말노드 : 적어도하나의자식을갖는노드 (A, B, C, D) A 비단말노드 B C D E F G H I J 단말노드 7

트리의용어 자식, 부모, 형제, 조상, 자손노드 : 인간과동일 레벨 (level) : 트리의각층의번호 높이 (height) : 트리의최대레벨 (3) 차수 (degree) : 노드가가지고있는자식노드의개수 레벨 1 A 부모노드 3 2 B 3 C 1 2 D 형제노드 3 자손노드 0 0 0 0 0 0 E F G H I J 8

예제 A는루트노드이다. B는 D와 E의부모노드이다. C는 B의형제노드이다. D와 E는 B의자식노드이다. B의차수는 2이다. 트리의높이는 4이다. A B C D E F G H I 9

트리의종류 트리 이진트리 일반트리 10

이진트리의소개

이진트리 (binary tree) Textbook 이진트리 서브트리는공집합 ( 단말노드 ) 일수있음 이진트리의노드에는최대 2개까지의자식노드가존재 모든노드의차수가 2 이하가됨 구현하기가편리함 이진트리에는서브트리들이구별됨 A T left T right 12

이진트리 (binary tree) 정의 : BT(Binary Tree) (1) a root (internal node or terminal node) (2) LBT(Left sub-bt) (3) RBT(Right sub-bt) A T left T right 13

이진트리검증 이진트리는공집합이거나 루트와왼쪽서브트리, 오른쪽서브트리로구성된노드들의유한집합 으로정의됨, 이진트리의서브트리들은모두이진트리여야함 SUB1 A SUB2 B C SUB3 공집합공집합공집합 D 공집합 공집합 14

이진트리의성질 노드의개수가 n 개이면간선의개수는 n-1 + 노드의개수 : 7 간선의개수 : 6 * / a b c d 15

이진트리의성질 높이가 h 인이진트리의경우, 최소 h 개의노드를가지며최대 2 h 1 개의노드를가짐 + + 2 2 1 = 2 높이 = 3 * * / 2 2 1 = 2 a a b c d 2 2 1 = 2 최소노드개수 = 3 최대노드개수 = 2 1 1 + 2 2 1 + 2 3 1 = 1 + 2 + 4 = 7 16

이진트리의성질 n 개의노드를가지는이진트리의높이 최대 n 최소 log 2 (n + 1) 1 2 3 높이 = 7 4 5 1 6 2 3 높이 = 3 7 4 5 6 7 (a) 최대높이 (b) 최소높이 17

이진트리의분류 포화이진트리 (full binary tree) 완전이진트리 (complete binary tree) 기타이진트리 A A A B C B C B C D E F G D E F G D E F G H I J I (a) 포화이진트리 (b) 완전이진트리 (c) 기타이진트리 18

포화이진트리 포화이진트리 (full binary tree) 정의 : 트리의각레벨에노드가꽉차있는이진트리 전체노드개수 : 2 1 1 + 2 2 1 + 2 3 1 + + 2 k 1 = k 1 i=0 2 i = 2 k 1 포화이진트리에서노드의번호 1 2 4 5 3 6 7 8 9 10 11 12 13 14 15 19

완전이진트리 완전이진트리 (complete binary tree) 정의 : 높이가 k 일때레벨 1 부터 k-1 까지는노드가모두채워져있고, 마지막레벨 k 에서는왼쪽부터오른쪽으로노드가순서대로채워져있는이진트리 중간에빈곳이있어서는안됨 포화이진트리와노드번호가일치 1 1 2 3 2 3 4 5 6 4 5 6 (a) 완전이진트리 (a) 완전이진트리가아님 20

이진트리의표현

이진트리의표현 배열을이용하는방법 포인터를이용하는방법 22

배열표현법 배열표현법 모든이진트리를포화이진트리라고가정하고각노드에번호를붙여서그번호를배열의인덱스로삼아노드의데이터를배열에저장하는방법 1 A 2 3 B C 4 5 6 D E F (a) 완전이진트리 0 1 A 2 B 3 C 4 D 5 E 6 F 7 8 8 D 1 A 2 B 4 C (a) 경사이진트리 0 1 A 2 B 3 4 C 5 6 7 8 D 23

부모와자식인덱스관계 노드 i 의부모노드인덱스 = i/2 노드 i 의왼쪽자식노드인덱스 = 2i 노드 i 의오른쪽자식노드인덱스 = 2i + 1 1 A 2 3 B C 4 5 6 D E F 0 1 A 2 B 3 C 4 D 5 E 6 F 7 8 24

링크표현법 링크표현법 포인터를이용하여부모노드가자식노드를가리키게하는방법 완전이진트리 A A B C B C NULL D E F NULL D NULL NULL E NULL NULL F NULL 경사이진트리 A A B B C C NULL D NULL D NULL 25

링크의구현 노드는구조체로표현 링크는포인터로표현 typedef struct TreeNode { int data; struct TreeNode *left, *right; } TreeNode; 26

링크표현법프로그램 (1/2) #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct TreeNode { int data; struct TreeNode *left, *right; } TreeNode; // n1 // / // n2 n3 void main() { TreeNode *n1, *n2, *n3; n1= (TreeNode *)malloc(sizeof(treenode)); n2= (TreeNode *)malloc(sizeof(treenode)); n3= (TreeNode *)malloc(sizeof(treenode)); 27

링크표현법프로그램 (2/2) n1->data = 10; // 첫번째노드를설정한다. n1->left = n2; n1->right = n3; n2->data = 20; // 두번째노드를설정한다. n2->right = NULL; n3->data = 30; // 세번째노드를설정한다. n3->right = NULL; } 28

이진트리의순회

이진트리의순회 순회 (traversal): 트리의노드들을체계적으로방문하는것 3가지의기본적인순회방법 전위순회 (preorder traversal) : VLR 자손노드보다루트노드를먼저방문 중위순회 (inorder traversal) : LVR 왼쪽자손, 루트, 오른쪽자손순으로방문 후위순회 (postorder traversal) : LRV 루트노드보다자손을먼저방문루트 V L R 왼쪽서브트리 오른쪽서브트리 30

전위순회 1. 루트노드를방문한다. 2. 왼쪽서브트리를방문한다. 3. 오른쪽서브트리를방문한다. 루트 1 1 2 3 2 7 3 6 8 9 왼쪽서브트리 오른쪽서브트리 4 5 10 11 31

전위순회알고리즘 순환호출을이용 preorder(x) if x NULL then print DATA(x); preorder(left(x)); preorder(right(x)); 32

전위순회응용 예 ) 구조화된문서출력 자료구조 1. 자료구조와 알고리즘이란? 2. 기초적인자료구조 3. 고급자료구조 1.1 자료구조 1.2 알고리즘 2.1 스택 2.2 큐 2.3 리스트 3.1 트리 3.2 그래프 33

중위순회 1. 왼쪽노드를방문한다. 2. 루트노드를방문한다. 3. 오른쪽서브트리를방문한다. 루트 2 6 1 3 4 8 2 5 7 10 왼쪽서브트리 오른쪽서브트리 1 3 9 11 34

중위순회알고리즘 순환호출을이용 inorder(x) if x NULL then inorder(left(x)); print DATA(x); inorder(right(x)); 35

중위순회응용 예 ) 수식트리 4 + 2 * / 6 1 a 3 5 7 b c d 36

후위순회 1. 왼쪽노드를방문한다. 2. 오른쪽서브트리를방문한다. 3. 루트노드를방문한다. 루트 3 11 1 2 5 10 3 4 6 9 왼쪽서브트리 오른쪽서브트리 1 2 7 8 37

후위순회알고리즘 순환호출을이용 postorder(x) if x NULL then postorder(left(x)); postorder(right(x)); print DATA(x); 38

후위순회응용 예 ) 디렉토리용량계산 5 나의문서 1 음악 50KB 그림 4 100KB 2 3 200KB 500KB 정지영상 동영상 39

순회프로그램 (1/3) typedef struct TreeNode { int data; struct TreeNode *left, *right; } TreeNode; // 15 // 4 20 // 1 16 25 TreeNode n1={1, NULL, NULL}; TreeNode n2={4, &n1, NULL}; TreeNode n3={16, NULL, NULL}; TreeNode n4={25, NULL, NULL}; TreeNode n5={20, &n3, &n4}; TreeNode n6={15, &n2, &n5}; TreeNode *root= &n6; 40

순회프로그램 (2/3) // 중위순회 inorder( TreeNode *root ){ if ( root ){ inorder( root->left ); // 왼쪽서브트리순회 printf("%d", root->data ); // 노드방문 inorder( root->right ); // 오른쪽서브트리순회 } } // 전위순회 preorder( TreeNode *root ){ if ( root ){ printf("%d", root->data ); // 노드방문 preorder( root->left ); // 왼쪽서브트리순회 preorder( root->right ); // 오른쪽서브트리순회 } } 41

순회프로그램 (3/3) // 후위순회 postorder( TreeNode *root ){ if ( root ){ postorder( root->left ); postorder( root->right ); printf("%d", root->data ); } } // 왼쪽서브트리순회 // 오른쪽서브트리순회 // 노드방문 void main() { inorder(root); preorder(root); postorder(root); } 42

레벨순회 각노드를레벨순으로검사하는순회방법 지금까지의순회법이스택을사용했던것에비해레벨순회는 큐를사용하는순회법 + 1 + * / / A B 2 * / 3 A B C D B C D 4 A B 5 6 C D 7 C D D 43

레벨순회알고리즘 level_order(root) 1. initialize queue; 2. if(root=null) then return; 3. enqueue(queue, root); 4. while is_empty(queue) TRUE do 5. x dequeue(queue); 6. print DATA(x); 7. if(x->left!= NULL) then 8. enqueue(queue, x->left); 9. if(x->right!= NULL) then 10. enqueue(queue, x->right); 44

수식트리 수식트리 : 산술식을트리형태로표현한것 비단말노드 : 연산자 (operator) 단말노드 : 피연산자 (operand) 예 ) + - or a b a < < b c a b c d 수식 a + b a - (b c) (a < b) or (c < d) 전위순회 + a b - a b c or < a b < c d 중위순회 a + b a - b c a < b or c < d 후위순회 a b + a b c - a b < c d < or 45

수식트리계산 후위순휘를사용 서브트리의값을순환호출로계산 비단말노드를방문할때양쪽서브트리의값을노드에저장된연산자를이용하여계산 * 3 2 7 + 3 6 1 2 4 5 5 6 46

수식트리알고리즘 evaluate(exp) 1. if exp = NULL 2. then return 0; 3. if exp left = NULL and exp right = NULL 4. then return exp data; 5. x evaluate(exp->left); 6. y evaluate(exp->right); 7. op exp data; 8. return (x op y); 47

프로그램 (1/2) typedef struct TreeNode { int data; struct TreeNode *left, *right; } TreeNode; // + // * + // 1 4 16 25 TreeNode n1={1, NULL, NULL}; TreeNode n2={4, NULL, NULL}; TreeNode n3={'*', &n1, &n2}; TreeNode n4={16, NULL, NULL}; TreeNode n5={25, NULL, NULL}; TreeNode n6={'+', &n4, &n5}; TreeNode n7={'+', &n3, &n6}; TreeNode *exp= &n7; 48

프로그램 (2/2) int evaluate(treenode *root) { if( root == NULL) return 0; if( root->left == NULL && root->right == NULL) return root->data; else { int op1 = evaluate(root->left); int op2 = evaluate(root->right); switch(root->data) { case '+': return op1+op2; case '-': return op1-op2; case '*': return op1*op2; case '/': return op1/op2; } } return 0; } void main() { printf("%d", evaluate(exp)); } 49

디렉토리용량계산 디렉토리용량을계산하는데후위트리순회사용 나의문서 음악 50KB 그림 100KB 200KB 500KB 정지영상 동영상 50

디렉토리용량계산프로그램 int calc_direc_size(treenode *root) { } void main() { } int left_size, right_size; if ( root ) { } left_size = calc_size( root->left ); right_size = calc_size(root->right ); return (root->data + left_size + right_size); TreeNode n4={500, NULL, NULL}; TreeNode n5={200, NULL, NULL}; TreeNode n3={100, &n4, &n5}; TreeNode n2={50, NULL, NULL}; TreeNode n1={0, &n2, &n3}; printf(" 디렉토리의크기 =%d\n",calc_direc_size(&n1)); 51

이진트리의연산

이진트리연산 : 노드의개수 탐색트리안의노드의개수를계산 각각의서브트리에대하여순환호출한다음, 반환되는값에 1 을더하여반환 int get_node_count(treenode *node) { } int count=0; if( node!= NULL ) { } count = 1 + get_node_count(node->left)+ get_node_count(node->right); return count; 6 3 2 1 1 1 53

이진트리연산 : 높이 서브트리에대하여순환호출하고서브트리들의반환값중에서최대값을구하여반환 int get_height(treenode *node) { int height=0; if( node!= NULL ) { } height = 1 + max(get_height(node->left), return height; } get_height(node->right)); h left h = max(h left, h right ) h right 54

스레드이진트리

스레드이진트리 스레드이진트리 (threaded binary tree) 정의 : NULL 링크에중위순회시에후속노드인중위후속자 (inorder successor) 를저장시켜놓은트리 이진트리의 NULL 링크를이용하여순환호출없이도트리의노드들을순회 4 G 2 6 C F 1 3 5 7 A B D E 56

스레드이진트리의구현 (1/3) 단말노드와비단말노드의구별을위하여 is_thread 필드필요 typedef struct TreeNode { int data; struct TreeNode *left, *right; int is_thread; // 만약오른쪽링크가스레드이면 TRUE } TreeNode; 57

스레드이진트리의구현 (2/3) 중위후속자를찾는함수작성 TreeNode *find_successor(treenode *p) { } // q 는 p 의오른쪽포인터 TreeNode *q = p->right; // 만약오른쪽포인터가 NULL 이거나스레드이면오른쪽포인터를반환 if( q==null p->is_thread == TRUE) return q; // 만약오른쪽자식이면다시가장왼쪽노드로이동 while( q->left!= NULL ) q = q->left; return q; 58

스레드이진트리의구현 (3/3) 스레드버전중위순회함수작성 void thread_inorder(treenode *t) { TreeNode *q; q=t; while (q->left!= NULL) q = q->left; // 가장왼쪽노드로간다. do { printf("%c ", q->data); // 데이터출력 q = find_successor(q); // 후속자함수호출 } while(q!= NULL); // NULL이아니면 } 59

이진탐색트리

이진탐색트리 정의 : 이진탐색트리의성질을만족하는이진트리 이진탐색트리의성질 모든노드의키는유일 key( 왼쪽서브트리 ) key( 루트노드 ) key( 오른쪽서브트리 ) 왼쪽과오른쪽서브트리도이진탐색트리 이진탐색를중위순회하면오름차순으로정렬된값을얻을수있음 루트 18 7 26 3 12 31 왼쪽서브트리 오른쪽서브트리 루트보다작은값루트보다큰값루트보다작은값루트보다큰값 27 61

이진탐색트리의탐색연산 (1/2) 탐색연산 비교한결과가같으면탐색이성공적으로끝남 비교한결과가, 주어진키값이루트노드의키값보다작으면탐색은이루트노드의왼쪽자식을기준으로다시시작함 비교한결과가, 주어진키값이루트노드의키값보다크면탐색은이루트노드의오른쪽자식을기준으로다시시작함 18 12 탐색 7 26 3 12 31 27 62

이진탐색트리의탐색연산 (2/2) 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); 18 12 탐색 7 26 3 12 31 27 63

탐색을구현하는방법 순환적방법 TreeNode *search(treenode *node, int key) { if ( node == NULL ) return NULL; if ( key == node->key ) return node; else if ( key < node->key ) return search(node->left, key); else return search(node->right, key); } 반복적방법 TreeNode *search(treenode *node, int key) { while(node!= NULL) { if( key == node->key ) return node; else if( key < node->key ) node = node->left; else node = node->right; } return NULL; // 탐색에실패했을경우 NULL 반환 } 64

이진탐색트리에서의삽입연산 삽입연산 이진탐색트리에원소를삽입하기위해서는먼저탐색을수행하는것이필요 탐색에실패한위치가바로새로운노드를삽입하는위치 탐색을먼저수행 탐색이실패한위치에 9를삽입 9 탐색 9 삽입 18 18 7 26 7 26 3 12 31 3 12 31 27 9 27 65

삽입연산알고리즘 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; z make_node(key); if p=null then root z; else if z->key < p->key then p->left z else p->right z // 트리가비어있음 66

삽입연산프로그램 (1/2) // key 를이진탐색트리 root 에삽입한다. // key 가이미 root 안에있으면삽입되지않는다. void insert_node(treenode **root, int key) { TreeNode *p, *t; // p는부모노드, t는현재노드 TreeNode *n; // n은새로운노드 t = *root; p = NULL; // 탐색을먼저수행 while (t!= NULL) { if( key == t->key ) return; p = t; if( key < p->key ) t = p->left; else t = p->right; } 67

삽입연산프로그램 (2/2) } // key 가트리안에없으므로삽입가능 n = (TreeNode *) malloc(sizeof(treenode)); if( n == NULL ) return; // 데이터복사 n->key = key; n->left = n->right = NULL; // 부모노드와링크연결 if( p!= NULL ) if( key < p->key ) p->left = n; else p->right = n; else *root = n; 68

이진탐색트리에서의삭제연산 삭제연산 3 가지의경우 삭제하려는노드가단말노드일경우 삭제하려는노드가왼쪽이나오른쪽서브트리중하나만가지고있는경우 삭제하려는노드가두개의서브트리모두가지고있는경우 69

삭제연산 단말노드삭제 CASE 1 : 삭제하려는노드가단말노드일경우 단말노드의부모노드를찾아서연결을끊는다. 35 35 18 68 18 68 7 26 99 7 26 99 3 12 22 30 3 12 22 70

삭제연산 서브트리를하나가지고있는노드삭제 CASE 2 : 삭제하려는노드가하나의서브트리만갖고있는경우 삭제할노드는삭제하고그노드의서브트리는부모노드에붙여준다. 35 35 18 68 18 99 7 26 99 7 26 3 12 22 30 3 12 22 71

삭제연산 두개의서브트리를가지고있는노드삭제 CASE 3 : 삭제하려는노드가두개의서브트리를갖고있는경우 삭제할노드를삭제하고삭제노드의후계자노드값을삭제된노드위치로가져온다. 35 35 35 18 68 18 68 22 68 7 26 99 7 26 99 7 26 99 3 12 22 30 3 12 22 30 3 12 30 왼쪽서브트리에서제일큰값 오른쪽서브트리에서제일작은값 72

삭제함수코드 (1/4) // 삭제함수 void delete_node(treenode **root, int key) { TreeNode *p, *child, *succ, *succ_p, *t; // key 를갖는노드 t 를탐색, p 는 t 의부모노드 p = NULL; t = *root; // key 를갖는노드 t 를탐색한다. while( t!= NULL && t->key!= key ) { p = t; t = ( key < t->key )? t->left : t->right; } // 탐색이종료된시점에 t 가 NULL 이면트리안에 key 가없음 if( t == NULL ) { // 탐색트리에없는키 printf("key is not in the tree"); return; } 73

삭제함수코드 (2/4) // 첫번째경우 : 단말노드인경우 if( (t->left==null) && (t->right==null) ) { if( p!= NULL ) { // 부모노드의자식필드를 NULL 로만든다. if( p->left == t ) p->left = NULL; else p->right = NULL; } } // 만약부모노드가 NULL이면삭제되는노드가루트 else *root = NULL; 74

삭제함수코드 (3/4) // 두번째경우 : 하나의자식만가지는경우 else if((t->left==null) (t->right==null)) { child = (t->left!= NULL)? t->left : t->right; if( p!= NULL ) { } if( p->left == t ) p->left = child; else p->right = child; // 부모를자식과연결 } else // 만약부모노드가 NULL 이면삭제되는노드가루트 *root = child; 75

삭제함수코드 (4/4) // 세번째경우 : 두개의자식을가지는경우 else{ // 오른쪽서브트리에서후계자를찾는다. succ_p = t; succ = t->right; // 후계자를찾아서계속왼쪽으로이동한다. while(succ->left!= NULL) { succ_p = succ; succ = succ->left; } // 후속자의부모와자식을연결 if( succ_p->left == succ ) succ_p->left = succ->right; else succ_p->right = succ->right; // 후속자가가진키값을현재노드에복사 t->key = succ->key; // 원래의후속자삭제 t = succ; } free(t); } 76

이진탐색트리의성능분석 성능분석 이진탐색트리에서의탐색, 삽입, 삭제연산의시간복잡도는트리의높이를 h 라고했을때 h 에비례함 1 2 4 5 3 6 7 높이 = log 2 n 8 9 10 11 12 13 14 15 77

이진탐색트리의성능분석 최선의경우 이진트리가균형적으로생성되어있는경우 h = log 2 n 최악의경우 한쪽으로치우친경사이진트리의경우 h = n 순차탐색과시간복잡도가같음 1 1 2 4 5 3 6 7 높이 = log 2 n 3 7 높이 = n 8 9 10 11 12 13 14 15 15 78