ํฐ์คํ ๋ฆฌ ๋ทฐ
์ด์งํ์ํธ๋ฆฌ : ๋ด๋ถ๋ ธ๋์ (ํค,์์) ์์ ์ ์ฅํ๋ฉฐ, 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;
}
๋ฐ์ํ
'Programming > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ทธ๋ํ] ์ธ์ ๋ฆฌ์คํธ, ์ธ์ ํ๋ ฌ (๋ฌด๋ฐฉํฅ) (0) | 2021.12.07 |
---|---|
[ํด์ํ ์ด๋ธ] (0) | 2021.11.22 |
[์ฌ์ ] ์ด์งํ์ ์์ฉ, ๋จ์ผ๋ชจ๋ ๋ฐฐ์ด (0) | 2021.10.20 |
[์ฌ์ ] ์ด์งํ์(์ฌ๊ท, ๋น์ฌ๊ท, ์ซ์๋ง์ถ๊ธฐ) (0) | 2021.10.20 |
[ํต ์ ๋ ฌ] ๋ฐฐ์ด์ ์ด์ฉํ ํต ์ ๋ ฌ ๊ตฌํ (0) | 2021.10.19 |
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
๋งํฌ
TAG
- ํ์ด์ฌ์ฝํ
- ์ฝ๋ฉ๊ณต๋ถ
- dreambooth
- ์ฝํ
- ๊ธฐ์ ์ปจํผ๋ฐ์ค
- AIRUSH
- MYSQL
- ์ฝ๋ฉ์๋ฌ
- ํ ํฌ์๋ฐ
- AIRUSH2023
- SKTECHSUMMIT
- ํ๋ก๊ทธ๋๋จธ์ค
- lgaimers
- HyperCLOVA
- WGAN
- DALLE
- ๋๋ฆผ๋ถ์ค
- ํ์ด์ฌ
- AI์ปจํผ๋ฐ์ค
- ๋ ผ๋ฌธ๋ฆฌ๋ทฐ
- ์คํ ์ด๋ธ๋ํจ์
- ๊ตฌ๊ธ์ฝ๋ฉ
- gan
- ์ฝํ ์ค๋น
- ๋ ผ๋ฌธ์ฝ๊ธฐ
- StableDiffusion
- CLOVAX
- SQL
- Aimers
- C์ธ์ด
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
๊ธ ๋ณด๊ดํจ