struct stu
{
int val;
stu* lc; //左孩子
stu* rc; //右孩子
};
stud* deleteMin(stud* subroot,stud*& min)
{
if(subroot->lc == NULL)
{
min = subroot; //左孩子为空,则根节点就是最小节点
return subroot->rc; //根节点最小,要删掉,所以返回右孩子
}
//左孩子不为空,根节点不是最小的,递归调用deleteMin,删除右子树的最小节点
subroot->rc = deleteMin(subroot,min);
return subroot;
}
stru* delete(stud *subroot,int val)
{
if(subroot==NULL) //树为空
return NULL;
if(subroot->val > val) //val在左子树中
//递归调用delete,在左子树中查找并删除val,同时更新左子树状态
subroot->lc = delete(subroot->lc,val);
else if(subroot->val < val) //val在右子树中
//递归调用delete,在右子树中查找并删除val,同时更新右子树状态
subroot->rc = delete(subroot->rc,val);
else{ //找到节点
//左节点为空,直接返回根的右节点,注意右节点也可能为空,但是没关系
if(subroot->lc == NULL)
subroot = subroot->rc;
//右节点为空,则返回根的左节点,注意右节点也可能为空,但是没关系
else if(subroot->rc == NULL)
subroot = subroot->lc;
else{ //左右孩子节点都不为空
stud* temp;
subroot->rc = deleteMin(subroot->rc,temp); //获取并删除右子树最小节点,更新右子树
subroot->val = temp->val; //用最小节点temp的值val替换根节点的内容
}
}
return subroot;
}
比较基础的内容,主要是要注意函数的递归调用,一开始在子树更新这块我没绕过来,所以不能理解。