第一种删除情况是,要删除的左右孩子不存在的情况,那么直接用左孩子或者右孩子顶替他,之后删除他即可
第二种删除情况是,要删除的左右孩子都存在,那么就要先找到他的直接后继,之后相互交换,之后用第一种方法将其删除
代码如下
BiTree Tree_Minmum(BiTree &root) // 查找直接后继节点
{
BiTree p = root;
while (p->lchild != NULL)
{
p=p->lchild;
}
return p;
}
void deleteNode(BiTree &root,int x){
if(root == NULL){
return;
}
if(root->data>x){
deleteNode(root->lchild,x);
}else if(root->data<x){
deleteNode(root->rchild,x);
}else{ //查找到了删除节点
if(root->lchild == NULL){ //左子树为空
BiTree tempNode = root;
root = root->rchild;
free(tempNode);
}else if(root->rchild == NULL){ //右子树为空
BiTree tempNode = root;
root = root->lchild;
free(tempNode);
}else{ //左右子树都不为空
//采用查找右子树最小数据来代替
BiTree tempNode = root->rchild;
tempNode->data=Tree_Minmum(tempNode);
root->data = tempNode->data;
deleteNode(root->rchild,tempNode->data);
}
}
}