二分探索木の関数をまとめていて、壁にぶち当たりました。指定された値を保持しているノードをツリーから削除する必要がある場合に発生する可能性のある各状況に取り組んでいます。ノードに左右の子がない場合、ノードを解放する方法がわかりません。関数はノードを返す必要があります。バックアップして、左右の子をそれぞれ調べ、値が子にある間に値を削除しますか? しかし、値がルートにある場合、それを削除する方法について同様の問題が発生しませんか? 説明として、プログラムは void ポインタを使用し、別の関数 compare() で TYPE val をキャストします。この関数は両方の値を評価し、< の場合は -1、== の場合は 0、> の場合は 1 を返します。
struct Node *_removeNode(struct Node *cur, TYPE val)
{
if (compare(cur->val, val) == 0) { //if val == cur->val
if (cur->right != NULL && cur->left != NULL) { //if cur has right and left
cur = _leftMost(cur->right);
free(_leftMost(cur->right));
}
else if (cur->right == NULL && cur->left != NULL) { //if cur has left
cur = cur->left;
free(cur->left);
}
else if (cur->right != NULL && cur->left == NULL){ //if cur has right
cur = cur->right;
free(cur->right);
}
else if (cur->right == NULL && cur->left == NULL){ //if cur has no child
//free cur if cur = val
}
}
else if (compare(cur->val, val) == -1) {
cur->right = _removeNode(cur->right, val);
}
else if (compare(cur->val, val) == 1) {
cur->left = _removeNode(cur->left, val);
}
return cur;
}