我一直在尝试从树中删除特定值,但没有将其删除,而是将其设置为0。与网络上的其他二进制搜索树相比,我的实现似乎很标准。我的所有其他功能都可以正常工作,除了我的RemoveNode。
struct Node{
int key;
Node *right;
Node *left;
Node(int data){
key=data;
right=NULL;
left=NULL;
}
};
class BST{
private:
Node *root;
void AddLeafPrivate(int key,Node *&Ptr){
if(Ptr==NULL){
Ptr=createLeaf(key);
}else if(key<Ptr->key){
if(Ptr->left!=NULL){
AddLeafPrivate(key,Ptr->left);
}else
{
Ptr->left=createLeaf(key);
}
}
else if(key>Ptr->key){
if(Ptr->right!=NULL){
AddLeafPrivate(key,Ptr->right);
}else
{
Ptr->right=createLeaf(key);
}
}
}
void PrintInOrderPrivate(Node *Ptr){
if(Ptr!=NULL){
if(Ptr->left!=NULL){
PrintInOrderPrivate(Ptr->left);
}cout<<Ptr->key<<" ";
if(Ptr->right!=NULL){
PrintInOrderPrivate(Ptr->right);
}
}else{
cout<<"tree is empty"<<endl;
}
}
Node *findMin(Node *Ptr){
if(Ptr->left!=NULL){
findMin(Ptr->left);
}else{
return Ptr;
}
}
void RemoveNodePrivate(int key,Node *parent){
if(parent==NULL){
cout<<"EMPTY TREE"<<endl;
return;
}else if(key<parent->key){
RemoveNodePrivate(key,parent->left);
}else if(key>parent->key){
RemoveNodePrivate(key,parent->right);
}else{
if(parent->left==NULL&&parent->right==NULL){
delete parent;
parent=NULL;
}else if(parent->left!=NULL&&parent->right==NULL){
Node *temp=parent;
parent=parent->left;
delete temp;
temp=NULL;
}else if(parent->left==NULL&&parent->right!=NULL){
Node *temp=parent;
parent=parent->right;
delete temp;
temp=NULL;
}else if(parent->left!=NULL&&parent->right!=NULL){
Node *temp=findMin(root->right);
root->key=temp->key;
RemoveNodePrivate(temp->key,root->right);
}
}
}
public:
BST(){
root=NULL;
}
Node *createLeaf(int key){
Node *n=new Node(key);
return n;
}
void AddLeaf(int key){
AddLeafPrivate(key,root);
}
void PrintInOrder(){
PrintInOrderPrivate(root);
}
void RemoveNode(int key){
RemoveNodePrivate(key,root);
}
};
int main()
{
BST tree;
tree.AddLeaf(5);
tree.AddLeaf(8);
tree.AddLeaf(12);
tree.AddLeaf(4);
tree.AddLeaf(3);
tree.AddLeaf(2);
tree.AddLeaf(7);
tree.RemoveNode(5);
tree.PrintInOrder();
cout<<endl;
}
我希望输出是2 3 4 7 8 12,但是它是2 3 4 7 0 8 12