aboutsummaryrefslogtreecommitdiff
path: root/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'tree.c')
-rw-r--r--tree.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/tree.c b/tree.c
index 50f9548..3c6a65c 100644
--- a/tree.c
+++ b/tree.c
@@ -132,27 +132,27 @@ tree_remove(struct tree_node *tree, T key)
132 tree->left = tree_remove(tree->left, key); 132 tree->left = tree_remove(tree->left, key);
133 else if ( key > tree->key ) 133 else if ( key > tree->key )
134 tree->right = tree_remove(tree->right, key); 134 tree->right = tree_remove(tree->right, key);
135 else { /* key == tree->key */ 135 else { /* key == tree->key */
136 /* TODO: Handle Collision */ 136 if ( --tree->count == 0 ) { /* Handle Collision */
137 struct tree_node *temp = tree;
137 138
138 struct tree_node *temp = tree; 139 if ( tree->left == NULL ) {
140 tree = tree->right;
141 }
142 else if ( tree->right == NULL ) {
143 tree = tree->left;
144 }
145 else {
146 struct tree_node *min = tree_detach_min(&tree->right);
139 147
140 if ( tree->left == NULL ) { 148 min->left = tree->left;
141 tree = tree->right; 149 min->right = tree->right;
142 }
143 else if ( tree->right == NULL ) {
144 tree = tree->left;
145 }
146 else {
147 struct tree_node *min = tree_detach_min(&tree->right);
148 150
149 min->left = tree->left; 151 tree = min;
150 min->right = tree->right; 152 }
151 153
152 tree = min; 154 free(temp);
153 } 155 }
154
155 free(temp);
156 } 156 }
157 return tree; 157 return tree;
158} 158}