반응형
SMALL

주요 용어

이진 탐색 트리(binary search tree) : 빠르게 탐색할 수 있도록 구성한 이진트리

키 : 각 노드를 식별하기 위해서는 별도의 간단한 이름을 붙여준 것

Splay 트리 : 자주 탐색하는 키를 가진 노드를 루트에 가깝게 위치하도록 구성한 이진 탐색 트리

AVL 트리 : 노드의 왼쪽 서브 트리 높이와 의 오른쪽 서브트리 높이가 최대 1만큼 차이가 난다는 조건을 만족하는 트리

트리의 높이 : 노드가 가질 수 있는 가장 높은 레벨에 1을 더한 값으로 루트로부터 잎까지 가장 긴 경로 길이

트리의 무게 : 트리에 속한 잎 노드의 개수

무게가 균형 잡힌 트리 : 각 노드의 양쪽 서브트리 무게가 균형을 유지하는 트리

 

 

 

01. 이진 탐색 트리

이진 탐색 트리 : 트리에서 특정 데이터의 효과적인 검색에 위해 제한점을 가지는 이진트리

- 특정 데이터를 검색하고, 노드를 삽입/삭제하는 응용문제에 가장 효과적인 이진트리

- 탐색에 최적화된 이진트리

- 키 : 이진트리의 노드의 데이터 (노드를 특정할 수 있는 값

 

♦ 노드 vi의 키를 ki 라 할 때 각 노드 vi 가 다음을 만족하는 이진트리를 이진 탐색 트리(BS트리)라 함

① vi의 왼쪽 서브 트리에 있는 모든 노드의 키값은 vi의 키값보다 작다.

② vi의 오른쪽 서브 트리에 있는 모든 노드의 키값은 vi의 키값보다 크다.

♦ 같은 순서 데이터에 대해서 BS트리를 다양하게 만들 수 있음

 

BS트리를 위한 노드 정의

struct KNode {
	struct KNode *left;		//왼쪽 자식을 위한 포인터
	char key[10];			//키값을 위한 문자 배열
	int info;				//데이터 필드
	struct KNode *right;	//오른쪽 자식을 위한 포인터
}

BS트리의 중위 순회

void Inorder(struct KNode *rootptr){
	if(rootptr != null){
		Inorder(rootptr -> left);
		printf("%d",rootptr->info);
		Inorder(rootptr->right);	 }		 }

 

 

BS트리에서 키값이 k인 노드를 찾는 과정

① 트리가 비어 있다면 탐색 실패, 아니면 k와 현재 루트 노드의 키값 ki를 비교한다.

② k = ki이면 탐색 성공, 이때 찾은 정점은 vi다.

③ k < ki 이면 vi 의 왼쪽 서브 트리를 탐색한다. 즉, vi = vi,left 로 바꾸고 ①로 간다.

④ k > ki 이면 vi 의 오른쪽 서브 트리를 탐색한다. 즉, vi = vi,right 로 바꾸고 ①로 간다.

 

 

BS트리의 노드 탐색

struct KNode *Search(chark[], struct KNode *r){
If(r==null)
return(null);
else
If(strcmp(k , r->key)==0)
return(r);
else if(strcmp(k , r-> key)<0)		//k < r-> key
	return(Search(k , r-> left));
		else return(Search(k , r->right)); 	}

 

BS트리의 노드 삽입 연산

① 트리가 비어 있다면 키 k를 가지는 노드를 삽입한다. 그렇지 않으면 k와 현재 루트 노드의 키 ki를 비교한다.

② k =ki이면 멈춘다.

③ k < ki이면 vi의 왼쪽 서브 트리에 삽입해야 하므로, vi = vi→ left 로 바꾸고 ①로 간다.

④ k > ki이면 vi의 오른쪽 서브 트리에 삽입해야 하므로, vi = vi→ right로 바꾸고 ①로 간다

 

BS트리의 노드 삽입 연산

struct KNode *Insert(struct KNode *newptr, struct KNode *r){
	if(r==null)
		return(newptr);
	else
		if(strcmp(newptr->key ,r->key)==0)
			DUPLICATE_ENTRY();
		else
			if(strcmp(newptr->key,r->key)<0) 
           		r->left = Insert(newprt,r->left);
			else 
            	r->right = Insert(newptr,r->right);
	return(r);								 }

 

키가 A인 노드와 F인 노드의 삽입

- 자식을 하나만 갖는 노드를 삭제하는 경우, [삭제한 노드를 가리키던 포인터]가 [그 노드의 null이 아닌 서브트리의 루트]를 가리키게 할당함

 

- 두 개의 자식 노드를 가지는 노드는 삭제 시 항상 특정 방향의 자식 노드를 올리는 방법으로 구현

(즉, 항상 오른쪽(혹은 왼쪽) 자식 노드를 삭제 위치로 이동)

 

반응형
LIST

'방송통신대학 > 자료구조' 카테고리의 다른 글

11-3. AVL트리, BB트리  (0) 2021.01.06
11-2. Splay트리  (0) 2021.01.05
10-3. 이진트리 개수  (0) 2021.01.03
10-2. 숲  (0) 2021.01.02
10-1. 선택트리  (0) 2021.01.01

+ Recent posts