diff options
| -rw-r--r-- | tree.c | 32 |
1 files changed, 16 insertions, 16 deletions
| @@ -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 | } |
