File tree Expand file tree Collapse file tree 4 files changed +45
-8
lines changed Expand file tree Collapse file tree 4 files changed +45
-8
lines changed Original file line number Diff line number Diff line change 10
10
typedef struct s_node
11
11
{
12
12
void *data;
13
+ struct s_node *parent;
13
14
struct s_node *left;
14
15
struct s_node *right;
15
16
} t_node;
Original file line number Diff line number Diff line change 6
6
/* By: jko <jko@student.42seoul.kr> +#+ +:+ +#+ */
7
7
/* +#+#+#+#+#+ +#+ */
8
8
/* Created: 2020/04/04 21:13:23 by jko #+# #+# */
9
- /* Updated: 2020/04/04 21:51:32 by jko ### ########.fr */
9
+ /* Updated: 2020/04/04 23:42:57 by jko ### ########.fr */
10
10
/* */
11
11
/* ************************************************************************** */
12
12
@@ -32,6 +32,7 @@ t_node *create_elem(void *data)
32
32
if (!node )
33
33
return (0 );
34
34
node -> data = data ;
35
+ node -> parent = 0 ;
35
36
node -> left = 0 ;
36
37
node -> right = 0 ;
37
38
return (node );
@@ -93,29 +94,62 @@ int tree_insert(t_tree *tree, void *data)
93
94
prev -> left = new ;
94
95
else
95
96
prev -> right = new ;
97
+ if (prev )
98
+ new -> parent = prev ;
99
+ tree -> size ++ ;
96
100
return (1 );
97
101
}
98
102
103
+ static t_node * find_next_bigger_parent (t_node * curr )
104
+ {
105
+ }
106
+
99
107
int tree_delete (t_tree * tree , void * data_ref , void (* free_data )(void * ))
100
108
{
109
+ t_node * parent ;
101
110
t_node * curr ;
111
+ t_node * temp ;
102
112
int cmp_result ;
103
113
104
- if (!tree || !free_data )
114
+ if (!tree || !free_data || tree_size ( tree ) == 0 )
105
115
return (0 );
106
116
curr = tree -> root ;
107
- if (tree -> cmp (data_ref , tree -> root ))
108
117
while (curr )
109
118
{
110
- if (!(cmp_result = tree -> cmp (data_ref , curr -> data )))
119
+ if ((cmp_result = tree -> cmp (data_ref , curr -> data )))
120
+ break ;
121
+ if (cmp_result < 0 )
122
+ curr = curr -> left ;
123
+ else
124
+ curr = curr -> right ;
125
+ }
126
+ if (!curr )
127
+ return (0 );
128
+ if (!curr -> parent )
129
+ tree -> root = 0 ;
130
+ temp = curr ;
131
+
132
+ if (!curr -> left && !curr -> right )
133
+ curr = 0 ;
134
+ else if (curr -> left && curr -> right )
135
+ {
136
+ curr = curr -> right
137
+ while (curr -> left && curr -> right )
111
138
{
112
- free_data (curr -> data );
113
- free (curr );
114
139
115
- return (1 );
116
140
}
117
141
}
142
+ else
143
+ curr = curr -> left ? curr -> left : curr -> right ;
118
144
145
+ if (cmp_result < 0 )
146
+ prev -> left = curr ;
147
+ else
148
+ prev -> right = curr ;
149
+ free_data (temp -> data );
150
+ free (temp );
151
+ tree -> size -- ;
152
+ return (1 );
119
153
}
120
154
121
155
void free_tree (t_tree * tree , void (* free_data )(void * ))
Original file line number Diff line number Diff line change 6
6
/* By: jko <jko@student.42seoul.kr> +#+ +:+ +#+ */
7
7
/* +#+#+#+#+#+ +#+ */
8
8
/* Created: 2020/04/04 21:11:12 by jko #+# #+# */
9
- /* Updated: 2020/04/04 21:50:29 by jko ### ########.fr */
9
+ /* Updated: 2020/04/04 23:09:48 by jko ### ########.fr */
10
10
/* */
11
11
/* ************************************************************************** */
12
12
18
18
typedef struct s_node
19
19
{
20
20
void * data ;
21
+ struct s_node * parent ;
21
22
struct s_node * left ;
22
23
struct s_node * right ;
23
24
} t_node ;
Original file line number Diff line number Diff line change 1
1
typedef struct s_node
2
2
{
3
3
void * data ;
4
+ struct s_node * parent ;
4
5
struct s_node * left ;
5
6
struct s_node * right ;
6
7
} t_node ;
You can’t perform that action at this time.
0 commit comments