二叉搜索树的删除:
在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除。
分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点
void Delete(BinTree*& root,int value) { BinTree* delnode= NULL; if(root == NULL) return ; BinTree* temp = root; BinTree* parent =NULL; while(temp!=NULL) { if(temp->value == value) break; else { parent = temp; if(temp->value >value) temp = temp->left; else temp =temp->right; } } if(temp ==NULL) return ; delnode = temp; // 删除的节点被找到 根据被删除的节点的情况来判断 // 如果节点的没有孩子 那么直接删除此节点 if(delnode->right ==NULL && delnode->left ==NULL) { cout<<"==="<<endl; //cout<<parent->value<<endl; if(delnode == root) { root=NULL; } if(parent && parent->left == delnode) { parent->left = NULL; } if(parent && parent->right == delnode) parent->right =NULL; delete delnode; } //如果此节点有一个孩子 if(delnode->right != NULL && delnode->left==NULL) { if(parent !=NULL) { if(parent->left == delnode) parent->left = delnode->right; else if(parent->right == delnode) parent->right = delnode->right; } else { root = delnode->right; } delete delnode; } if(delnode->left !=NULL&&delnode->right== NULL) { if(parent !=NULL) { if(parent->left == delnode) parent->left = delnode->left; else if(parent->right = delnode) parent->right = delnode->right; } else { root = delnode->left; } delete delnode; } //两个节点都不为空 if(delnode->left !=NULL && delnode->right !=NULL) { temp = delnode->right; parent = delnode; while(temp->left !=NULL) { parent = temp; temp = temp->left; } delnode->value = temp->value; parent->left = temp->right; delete temp; //Delete(delnode->right,temp->value); } }
时间: 2024-10-26 10:43:36