ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ : ๋‚ด๋ถ€๋…ธ๋“œ์— (ํ‚ค,์›์†Œ) ์Œ์„ ์ €์žฅํ•˜๋ฉฐ, key(u)<key(v)<key(w)๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ํŠธ๋ฆฌ

- ์ ์ •์ด์ง„ํŠธ๋ฆฌ ์ „์ œ

- ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„์ˆœํšŒํ•˜๋ฉด์„œ ํ‚ค๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธ

 

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ (Binary Search Tree)์˜ ์กฐ๊ฑด

- ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ฃจํŠธ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ์— ํ•˜๋‚˜ ์˜ค๋ฅธ์ชฝ์— ํ•˜๋‚˜์”ฉ ์—ฐ๊ฒฐ๋œ๋‹ค.

- ๋…ธ๋“œ N(์–ด๋Š ํ•œ ๋…ธ๋“œ)์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํŠธ๋ฆฌ์˜ ํ‚ค๊ฐ’์€ ๋…ธ๋“œ N๋ณด๋‹ค ์ž‘์•„์•ผ ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ํŠธ๋ฆฌ์˜ ํ‚ค ๊ฐ’์€ ๋…ธ๋“œ N๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค.

- ๊ฐ™์€ ํ‚ค๊ฐ’์„ ๊ฐ–๋Š” ๋…ธ๋“œ๋Š” ์—†๋‹ค.

 

๋ฌธ์ œ: ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ๊ตฌํ˜„ (์ „์œ„์ˆœํšŒ ์ถœ๋ ฅ)

 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ

typedef struct treeNode {
	int key;
	struct treeNode* lchild;
	struct treeNode* rchild;
	struct treeNode* parent;
}node;

int isExternal(node* w) {
	if (w->lchild == NULL && w->rchild == NULL)
		return 1;
	else
		return 0;
}

int isInternal(node* w) {
	if (w->lchild != NULL || w->rchild != NULL)
		return 1;
	else
		return 0;
}

void getNode(node** w) {
	(*w) = (node*)malloc(sizeof(node));
	(*w)->parent = NULL;
	(*w)->lchild = NULL;
	(*w)->rchild = NULL;
}

void expandExternal(node* w) {//์–‘์ชฝ ์™ธ๋ถ€๋…ธ๋“œ๋กœ ํ™•์žฅ
	node* newleft;
	node* newright;

	getNode(&newleft);
	getNode(&newright);

	w->lchild = newleft;
	w->rchild = newright;
	newleft->parent = w;
	newright->parent = w;
}

node* treeSearch(node* w, int k) {
	if (isExternal(w))
		return w;

	if (k == w->key)
		return w;
	else if (k < w->key)
		return treeSearch(w->lchild, k);
	else
		return treeSearch(w->rchild, k);
}

void insertKey(node* root, int k) {
	node* w = treeSearch(root, k);

	if (isInternal(w))
		return;
	else {
		w->key = k;
		expandExternal(w);
		return;
	}
}

void findElement(node* root, int k) {
	node* w = treeSearch(root, k);
	if (isInternal(w))
		printf("%d\n", k);
	else
		printf("X\n");
}

node* sibling(node* root, node* z) {// w์™€ z์—†์• ๊ณ  ๋ถ™์ผ ๋…ธ๋“œ ์ •ํ•˜๊ธฐ
	if (root == z)
		return root;
	if (z->parent->lchild == z)
		return z->parent->rchild;
	else
		return z->parent->lchild;
}

node* inOrderSucc(node* w) {// ์ค‘์œ„์ˆœํšŒ ๊ณ„์Šน์ž ๊ตฌํ•˜๊ธฐ
	node* y = w->rchild;// y๋Š” ์šฐ์„  w์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ ์ด๋™ ํ›„

	if (isExternal(y))
		return y;
	while (isInternal(y->lchild))// ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์™ผ์ชฝ ์ž์‹๋งŒ์„ ๋๊นŒ์ง€ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๋ฉด ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋‚ด๋ถ€๋…ธ๋“œ์ž„
		y = y->lchild;

	return y;//์ค‘์œ„์ˆœํšŒ ๊ณ„์Šน์ž ๋ฐ˜ํ™˜
}

void reduceExternal(node** root, node* z) {
	node* w = z->parent;
	node* zs, * g;
	zs = sibling(*root, z);

	if (w == *root) {
		*root = zs;
		zs->parent = NULL;
	}
	else {
		g = w->parent;
		zs->parent = g;

		if (w == g->lchild)
			g->lchild = zs;
		else
			g->rchild = zs;
	}

	free(z);
	free(w);
}

node* removeElement(node** root, int k) {
	node* w = treeSearch(*root, k);

	if (isExternal(w)) {
		printf("X\n");
		return;
	}

	//์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด
	node* z = w->lchild;
	if (!isExternal(z))//
		z = w->rchild;
	if (isExternal(z))
		reduceExternal(root, z);
	else {// case2
		node* y = inOrderSucc(w);// ์ค‘์œ„์ˆœํšŒ ๊ณ„์Šน์ž y
		z = y->lchild;//๋…ธ๋“œ z๋Š” y์˜ ์™ผ์ชฝ ์ž์‹์ธ ์™ธ๋ถ€๋…ธ๋“œ
		w->key = y->key;//y์˜ ๋‚ด์šฉ์„ w์— ๋ณต์‚ฌํ•˜๊ณ 
		reduceExternal(root, z);//๋…ธ๋“œ y์™€ z ์‚ญ์ œ
	}
	printf("%d\n", k);
}

void printNode(node* root) {
	if (isExternal(root))
		return;
	else {
		printf(" %d", root->key);
		printNode(root->lchild);
		printNode(root->rchild);
	}
}

void freeNode(node* root) {
	if (isExternal(root))
		return;
	else {
		freeNode(root->lchild);
		freeNode(root->rchild);
		free(root);
	}
}

int main() {
	char type;
	int key;

	node* root = (node*)malloc(sizeof(node));
	getNode(&root);

	while (1) {
		scanf("%c", &type);

		if (type == 'q')
			break;
		else if (type == 'i') {
			scanf("%d", &key);
			getchar();
			insertKey(root, key);
		}
		else if (type == 'd') {
			scanf("%d", &key);
			getchar();
			removeElement(&root, key);//
		}
		else if (type == 's') {
			scanf("%d", &key);
			getchar();
			findElement(root, key);
		}
		else if (type == 'p') {
			printNode(root);
			printf("\n");
		}
	}

	freeNode(root);

	return 0;
}
๋ฐ˜์‘ํ˜•