基本的に、プログラムはバイナリ ツリーの最初のノードを指す BST クラスで構成され、ノードも独自のクラスです。
BST はこのメンバー関数を呼び出します。
void remove(const T& x)
{
removeNode(m_root, x);
return;
}
そして、これは remove ノードの再帰部分であり、完了するまで実行されます。
template <typename T>
void removeNode(TreeNode<T>* &p, const T& x)
{
if(p == NULL)
return;
if(x < p -> m_data)
removeNode(p -> m_left, x);
else if(x > p -> m_data)
removeNode(p -> m_right, x);
else
{
TreeNode<T>* tmp = new TreeNode<T>;
if(p -> m_left == NULL)
{
tmp = p -> m_right;
delete p;
p = tmp;
}
else if(p -> m_right == NULL)
{
tmp = p -> m_left;
delete p;
p = tmp;
}
else
{
tmp = p -> m_right;
TreeNode<T>* tmp2 = new TreeNode<T>;
while(tmp -> m_left != NULL)
{
tmp2 = tmp;
tmp = tmp -> m_left;
}
p -> m_data = tmp -> m_data;
if(tmp2 != NULL)
removeNode(tmp2 -> m_left, tmp -> m_left -> m_data);
else
removeNode(p -> m_right, p -> m_right -> m_data);
}
}
return;
}
remove() 関数が戻ったときにセグ フォールトが発生しました。その理由を知りたいですか?