Skip to content

Commit a89c997

Browse files
committed
binary search tree / add size
1 parent 136a48d commit a89c997

File tree

4 files changed

+81
-7
lines changed

4 files changed

+81
-7
lines changed

tree/binary_search_tree/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
{
1919
t_node *root;
2020
int (*cmp)(void *, void *);
21+
int size;
2122
} t_tree;
2223
```
2324

@@ -35,6 +36,12 @@
3536
t_node *create_elem(void *data);
3637
```
3738

39+
### tree_size
40+
- tree에 존재하는 요소의 갯수를 반환하는 함수를 작성하세요.
41+
```
42+
int tree_size(t_tree *tree);
43+
```
44+
3845
### tree_find
3946
- tree에 data_ref와 같은 data를 갖는 요소를 찾아 반환하는 함수를 작성하세요.
4047
- 같은 요소가 없다면 널 포인터를 반환 합니다.
@@ -55,6 +62,7 @@
5562
- tree에서 data_ref와 같은 data를 가진 요소를 삭제하는 함수를 작성하세요.
5663
- 요소의 데이터는 free_data를 사용해서 메모리 할당을 해제해야 합니다.
5764
- 성공하면 1, 실패하면 0을 반환 합니다.
65+
- data_ref와 같은 data를 가진 요소가 없다면 실패 합니다.
5866
```
5967
int tree_delete(t_tree *tree, void *data_ref, void (*free_data)(void *));
6068
```

tree/binary_search_tree/implementation_example/binary_search_tree.c

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: jko <jko@student.42seoul.kr> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2020/04/04 21:13:23 by jko #+# #+# */
9-
/* Updated: 2020/04/04 21:21:42 by jko ### ########.fr */
9+
/* Updated: 2020/04/04 21:51:32 by jko ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -20,6 +20,7 @@ t_tree *tree_init(int (*cmp)(void *, void *))
2020
return (0);
2121
tree->root = 0;
2222
tree->cmp = cmp;
23+
tree->size = 0;
2324
return (tree);
2425
}
2526

@@ -36,22 +37,84 @@ t_node *create_elem(void *data)
3637
return (node);
3738
}
3839

39-
int tree_insert(t_tree *tree, void *data)
40+
int tree_size(t_tree *tree)
4041
{
41-
t_node *new;
42-
43-
if (!tree || !(new = create_elem(data)))
42+
if (!tree)
4443
return (0);
45-
44+
return (tree->size);
4645
}
4746

4847
t_node *tree_find(t_tree *tree, void *data_ref)
4948
{
49+
t_node *curr;
50+
int cmp_result;
51+
52+
if (!tree)
53+
return (0);
54+
curr = tree->root;
55+
while (curr)
56+
{
57+
if (!(cmp_result = tree->cmp(data_ref, curr->data)))
58+
return (curr);
59+
if (cmp_result < 0)
60+
curr = curr->left;
61+
else
62+
curr = curr->right;
63+
}
64+
return (0);
65+
}
66+
67+
int tree_insert(t_tree *tree, void *data)
68+
{
69+
t_node *new;
70+
t_node *curr;
71+
t_node *prev;
72+
int cmp_result;
5073

74+
if (!tree)
75+
return (0);
76+
curr = tree->root;
77+
prev = 0;
78+
while (curr)
79+
{
80+
if (!(cmp_result = tree->cmp(data, curr->data)))
81+
return (0);
82+
prev = curr;
83+
if (cmp_result < 0)
84+
curr = curr->left;
85+
else
86+
curr = curr->right;
87+
}
88+
if (!(new = create_elem(data)))
89+
return (0);
90+
if (!prev)
91+
tree->root = new;
92+
else if (cmp_result < 0)
93+
prev->left = new;
94+
else
95+
prev->right = new;
96+
return (1);
5197
}
5298

5399
int tree_delete(t_tree *tree, void *data_ref, void (*free_data)(void *))
54100
{
101+
t_node *curr;
102+
int cmp_result;
103+
104+
if (!tree || !free_data)
105+
return (0);
106+
curr = tree->root;
107+
if (tree->cmp(data_ref, tree->root))
108+
while (curr)
109+
{
110+
if (!(cmp_result = tree->cmp(data_ref, curr->data)))
111+
{
112+
free_data(curr->data);
113+
free(curr);
114+
115+
return (1);
116+
}
117+
}
55118

56119
}
57120

tree/binary_search_tree/implementation_example/tree.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: jko <jko@student.42seoul.kr> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2020/04/04 21:11:12 by jko #+# #+# */
9-
/* Updated: 2020/04/04 21:13:05 by jko ### ########.fr */
9+
/* Updated: 2020/04/04 21:50:29 by jko ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -26,10 +26,12 @@ typedef struct s_binary_search_tree
2626
{
2727
t_node *root;
2828
int (*cmp)(void *, void *);
29+
int size;
2930
} t_tree;
3031

3132
t_tree *tree_init(int (*cmp)(void *, void *));
3233
t_node *create_elem(void *data);
34+
int tree_size(t_tree *tree);
3335
int tree_insert(t_tree *tree, void *data);
3436
t_node *tree_find(t_tree *tree, void *data_ref);
3537
int tree_delete(t_tree *tree, void *data_ref, void (*free_data)(void *));

tree/binary_search_tree/tree.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ typedef struct s_binary_search_tree
99
{
1010
t_node *root;
1111
int (*cmp)(void *, void *);
12+
int size;
1213
} t_tree;

0 commit comments

Comments
 (0)