@@ -133,25 +133,31 @@ void doDelete(){
133
133
dNode = NULL ;
134
134
} else if (dNode -> left != NULL ){
135
135
predecessor = findMax (dNode -> left ); // Get predecessor
136
- // update predecessor parent
137
- if (predecessor -> parent -> left != NULL ) {
138
- if (predecessor -> parent -> left -> value == predecessor -> value ) predecessor -> parent -> left = NULL ;
139
- } else predecessor -> parent -> right = NULL ;
140
-
136
+
141
137
// swap with predecessor
142
- dNode -> value = predecessor -> value ;
143
- free (predecessor );
138
+ if (predecessor -> left != NULL ){
139
+ if (predecessor -> parent -> right == predecessor )predecessor -> parent -> right = predecessor -> left ;
140
+ else predecessor -> parent -> left = predecessor -> left ;
141
+
142
+ predecessor -> left -> parent = predecessor -> parent ;
143
+ }
144
+
145
+ dNode -> value = predecessor -> value ;
146
+ free (predecessor );
144
147
145
148
} else {
146
149
successor = findMin (dNode -> right ); // Get successor
147
150
// update successor parent
148
- if (successor -> parent -> left != NULL ) {
149
- if (successor -> parent -> left -> value == successor -> value ) successor -> parent -> left = NULL ;
150
- } else successor -> parent -> right = NULL ;
151
-
152
- // swap with predecessor
153
- dNode -> value = successor -> value ;
154
- free (successor );
151
+ // swap with predecessor
152
+ if (successor -> right != NULL ){
153
+ if (successor -> parent -> right == successor )successor -> parent -> right = successor -> right ;
154
+ else successor -> parent -> left = successor -> right ;
155
+
156
+ successor -> right -> parent = successor -> parent ;
157
+ }
158
+
159
+ dNode -> value = successor -> value ;
160
+ free (successor );
155
161
}
156
162
157
163
if (temp -> parent != NULL ) balanceCheck (temp -> parent );
0 commit comments