
196
12
章 動的メモリ管理
置き換えねばならない。それは決して2つの子がある節点ではあり得ない。例えば、図12-1
の木から根節点を取り除くには、値11を持つ節点で置き換える。この削除アルゴリズムは、
唯一可能なものではないが、木の高さを増やさないという利点がある。
再帰ヘルパー関数
detachMin()
は、指定された部分木から最小節点を取り除き、節点へ
のポインタを返す。
static Node_t* detachMin(Node_t** ppNode)
{
Node_t* pNode = *ppNode; //
現在の節点へのポインタ
if (pNode == NULL)
{
return NULL; // pNode
は空部分木
}
else if (pNode->left != NULL)
{
r
eturn detachMin(&(pNode->left)); //
最小値は左部分木
}
else //
左部分木を持たないなら
{ // pNode
は最小値を指す
*ppNode = pNode->right; //
右の子を親に付ける
return pNode;
}
}
この関数を
erase()
と
BST_erase()
の定義で使う。
static _Bool erase(BST_t* pBST, Node_t** ppNode, const void* pKey);
_Bool BST_erase(BST_t* pBST, const void* pKey)
{
if (pBST
== NULL ...