我想刪除特定的節點,但我沒有看到問題出在哪裏。如何刪除特定節點是二叉搜索樹?
其實,我通過Find()
得到節點,然後用Remove()
刪除它。
該程序崩潰,每當Delete()
火災。
bool RemoveNode(int key)
{
if (IsEmpty())
return false;
Node* r = Find(key,root);
if (r==nullptr)
return false;
return Remove(r);
}
bool Remove (Node* &r)
{
if (r->left==nullptr && r->right ==nullptr)
{
delete r;
r=nullptr;
return true;
}
if (r->left==nullptr)
{
Node* temp = r->right;
delete r;
r=nullptr;
r=temp;
return true;
}
if (r->right==nullptr)
{
Node* temp = r->left;
delete r;
r=nullptr;
r=temp;
return true;
}
Node* Max = FindMax(r->left);
r->data = Max->data;
Remove(Max);
return true;
}
Node* FindMax(Node* r)
{
if(r->right==nullptr)
return r;
return FindMax(r->right);
}
Node* Find(int key, Node* &r)
{
if (r==nullptr)
return nullptr;
if (r->data==key)
return r;
if (key < r->data)
return Find(key,r->left);
else
return Find(key,r->right);
}
難道你不需要更新「父」,不再指向已刪除的子節點嗎? – Justin
你使用過調試器嗎? – clcto