Notice
Recent Posts
Recent Comments
Link
Tags
- C++
- ๋นํธ๋ง์คํน
- ์นด์นด์ค ์ฝํ
- ํ๋ก๊ทธ๋๋จธ์ค
- ํ๋ฆฌ์จ๋ณด๋ฉ
- Python
- ์ด๋ถํ์
- ๋ฐฑ์ค
- ํธ๋ฆฌ
- LCs
- DP
- BFS
- ๋ค์ต์คํธ๋ผ
- ์์ฝ๋
- go
- ์น๋ฆฐ์ด
- ์ฌ๊ท
- ์นด์นด์ค2021
- ์ํฐ๋
- js
- ๋นํธ๋งต
- nestjs
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ์๊ณ ๋ฆฌ์ฆ
- golang
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- Union-Find
- DFS
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
Archives
- Today
- Total
Hello Ocean! ๐ผ
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ์๋ฃ๊ตฌ์กฐ_2 ๋ณธ๋ฌธ
๋ฐ์ํ
1.ํธ๋ฆฌ, ๊ทธ๋ํ
๋น์ ํ ๊ตฌ์กฐ
์ ํ๊ตฌ์กฐ๋ ์๋ฃ๋ฅผ ์ ์ฅํ๊ณ ๊บผ๋ด๋ ๊ฒ์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์๊ณ , ๋น์ ํ๊ตฌ์กฐ๋ ํํ์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์์ต๋๋ค.
ํธ๋ฆฌ
-
ํธ๋ฆฌ์ ๊ตฌ์ฑ ์์
- Root Node : ํธ๋ฆฌ ๊ตฌ์กฐ์์ ์ต์์์ ์กด์ฌํ๋ ๋ ธ๋ (A)
- Node : ํธ๋ฆฌ์ ๊ตฌ์ฑ์์์ ํด๋นํ๋ ์์ (A,B,C,D,E,F,G)
- Edge : ๋ ธ๋์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ์
- Terminal Node(Leaf Node) : ํธ๋ฆฌ์ ๋งจ ๋ฐ์ ์๋ ์์์ ๊ฐ์ง์ง ์๋ ๋ ธ๋
- Sub-Tree : ์ ์ฒด ํธ๋ฆฌ์ ์ํ๋ ์์ ํธ๋ฆฌ
- Level : ํธ๋ฆฌ์์ ๊ฐ ์ธต๋ณ๋ก ์ซ์๋ฅผ ๋งค๊น (root node = level 0)
- Height : ํธ๋ฆฌ์ ์ต๊ณ ๋ ๋ฒจ
-
ํธ๋ฆฌ์ ์ข ๋ฅ
-
์ด์งํธ๋ฆฌ (binary tree)
์ด๋ค ํ ๋ ธ๋๊ฐ 2๊ฐ ์ดํ์ ์์๋ง์ ๊ฐ์ง๋ ํธ๋ฆฌ
-
ํฌํ์ด์งํธ๋ฆฌ (perfect binary tree)
leaf๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๊ฐ 2๊ฐ์ ์์์ ๊ฐ์ง๋ ํธ๋ฆฌ
- ๋์ด๊ฐ d์ธ ํฌํ์ด์งํธ๋ฆฌ์ ๋
ธ๋ ์
2^(d+1)-1
- ๋์ด๊ฐ d์ธ ํฌํ์ด์งํธ๋ฆฌ์ ๋
ธ๋ ์
-
์์ ์ด์งํธ๋ฆฌ (complete binary tree)
ํฌํ์ด์งํธ๋ฆฌ์์ leaf๋ฅผ ์ค๋ฅธ์ชฝ๋ถํฐ ์ ๊ฑฐํ์ฌ ์ป๋ ํธ๋ฆฌ
์์์๋ถํฐ ์์๋๋ก ๊ฝ ์ฑ์์ง ๋ชจ์์ด๋ค- ๋์ด๊ฐ h์ธ ์์ ์ด์งํธ๋ฆฌ์ ๋ ธ๋ ์๋ 2^h ์ด์ 2^(h+1)์ดํ์ด๋ค.
-
-
๊ตฌํ
- ๋ ธ๋์ ๊ตฌ์กฐ
- ์ฃผ๋ก ์ฐ๊ฒฐ๋ฆฌ์คํธ ํน์ ๋ฐฐ์ด๋ก ๊ตฌํํ๋ค.
- ํ์ํ ํจ์
- Create: ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ
- Destroy: ์ฌ์ฉ๋๋ ํธ๋ฆฌ๋ฅผ ํ๊ธฐํ๊ธฐ
- Insert: ํธ๋ฆฌ์ ์๋ก์ด ๋ ธ๋๋ฅผ ์ฝ์ ํ๊ธฐ
- Delete: ํธ๋ฆฌ์ ํน์ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ธฐ
- Search: ์ฃผ์ด์ง ํค๋ฅผ ๊ฐ์ง ๋ ธ๋ ๋ ์ฝ๋๋ฅผ ๊ฒ์ํ๊ธฐ
- IsEmpty: ๋น ํธ๋ฆฌ์ธ์ง๋ฅผ ํ์ธํ๊ธฐ
- CopyTree: ์ฃผ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ณต์ฌํ๊ธฐ
- Traverse: ํธ๋ฆฌ ๋ด๋ถ ๋ ธ๋๋ฅผ ํ๋์ฉ ์ํํ๊ธฐ
์ด์งํ์ํธ๋ฆฌ์ ๊ตฌํ
- ์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ ธ๋ ์์น๋ฅผ ์ ์ํ ์ด์งํธ๋ฆฌ
#include <stdio.h>
#include <stdlib.h>
//๋ถ๋ชจ๋
ธ๋ ์ธ๋ฑ์ค i/2
//์ผ์ชฝ์์ ์ธ๋ฑ์ค 2i
//์ค๋ฅธ์ชฝ ์์ ์ธ๋ฑ์ค 2i+1
typedef struct TreeNode { //๊ตฌ์กฐ์ฒด
int key;
struct TreeNode *left,*right;
}TreeNode;
//์ ์ ์ํ
preorder(TreeNode *root) {
if(root){
printf("%d ",root->key);
preorder(root->left);
preorder(root->right);
}
}
//์ค์ ์ํ
inorder(TreeNode *root) {
if(root){
inorder(root->left);
printf("%d ",root->key);
inorder(root->right);
}
}
//ํ์ ์ํ
postorder (TreeNode *root) {
if(root){
postorder(root->left);
postorder(root->right);
printf("%d ",root->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; // ํ์ ์คํจํ ๊ฒฝ์ฐ
}
//๋
ธ๋ ์ฝ์
void insert_node(TreeNode **root, int key) {
TreeNode *parent, *t;
TreeNode *new;
t = *root;
parent = NULL;
while (t != NULL) {
if (key == t->key)
return;
parent = t;
if (key < t->key)
t = t->left;
else
t = t->right;
}
new = (TreeNode *)malloc(sizeof(TreeNode));
if (new == NULL)
return;
new->key = key;
new->left = new->right = NULL;
if (parent != NULL)
if (key < parent->key)
parent->left = new;
else
parent->right = new;
else
*root = new;
}
//๋
ธ๋ ์ญ์
void delete_node(TreeNode **root,int key) {
TreeNode *parent,*child,*suc,*suc_parent,*t;
parent = NULL;
t=*root;
while(t != NULL && t->key != key) {
parent = t;
t=(key<parent->key) ? parent->left : parent->right ;
}
if (t==NULL) {
printf("ํ์ ์คํจ\n");
return;
}
//๋จ๋ง ๋
ธ๋์ธ ๊ฒฝ์ฐ
if((t->left==NULL)&&(t->right==NULL))
if(parent != NULL)
if(parent->left==t)
parent->left=NULL;
else
parent->right=NULL;
else
*root=NULL;
//ํ๋์ ์์๋ง ๊ฐ์ง๋ ๊ฒฝ์ฐ
else if((t->left==NULL)||(t->right==NULL)) {
child = (t->left != NULL) ? t->left : t->right;
if(parent != NULL)
if(parent->left==t)
parent->left=child;
else
parent->right=child;
else
*root=child;
}
//๋ ๊ฐ์ ์์์ ๊ฐ์ง๋ ๊ฒฝ์ฐ
else {
//์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๋งจ ์ผ์ชฝ ๋
ธ๋๊ฐ ํ๊ณ์
suc_parent=t;
suc=t->right;
while(suc->left != NULL) {
suc_parent = suc;
suc=suc->left;
}
//ํ๊ณ์์ ๋ถ๋ชจ์ ์์์ ์ฐ๊ฒฐ
if(suc_parent->left==suc)
suc_parent->left=suc->right;
else
suc_parent->right=suc->right;
//ํ์์๊ฐ ๊ฐ์ง ํค ๊ฐ์ ํ์ฌ ๋
ธ๋์ ๋ณต์ฌ
t->key=suc->key;
t=suc;
}
free(t);
}
int main(void) {
TreeNode *root=NULL;
insert_node(&root,30);
inorder(root);
printf("\n");
insert_node(&root,20);
insert_node(&root,40);
inorder(root);
printf("\n");
insert_node(&root,15);
insert_node(&root,25);
insert_node(&root,35);
insert_node(&root,45);
inorder(root);
printf("\n");
delete_node(&root,30);
inorder(root);
printf("\n");
return 0;
}
๋ฐ์ํ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(์ฝ์ , ๋ฒ๋ธ, ํต) (0) | 2020.08.17 |
---|---|
[์คํฐ๋] ๋นํธ์กฐ์ , ์์ ํ์ (0) | 2020.08.03 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ์๋ฃ๊ตฌ์กฐ_1 (0) | 2020.07.20 |
go ์ธ์ด ์์ํ๊ธฐ (0) | 2020.07.07 |
[์๊ณ ์คํ] ์์ํ #Quantize, ์ฑ 8.9์ (0) | 2020.05.11 |