主题:请教有关严版二叉排序树的一个删除操作。
Status DeleteBST(BiTree &T, KeyType key) {
if (!p) return FALSE; //不存在关键字等于key的数据元素
else {
if (EQ(key,T->data.key)) Delete(T); //找到关键字等于key的数据元素
else if (LT(key,T->data.key)) DeleteBST(T->lchild,key);
else DeleteBST(T->rchild,key)
return TRUE;
}
}//DeleteBST
其中删除操作过程如下所描述~~~
void Delete(BiTree &p) {
//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点p,并返回TRUE;否则返回FALSE
if (p->rchild) { q=p; p=p->lchild; free(q); }//右子树空只需要重接它的左子树
else if (!p->lchild) {q=p; p=p->rchild; free(q); } //左子树空只需要重接它的右子树
else { q=p; s=p->lchild;
while(!s->rchild) {q=s; s=s->rchild }
p->data=s->data;
if(q!=p) q->rchild=s->lchild ;
else q->lchild=s->lchild;
free(s);
}
}//Delete
我的疑问~针对左子树 或者 右子树 空的情况。
仅仅用p=p->lchild 怎么能接上呢?
就比如 树 1
2 <-p
3
假设要删除结点2.如果仅仅操作 p=p->lchild 有什么用 虽然p是指向了3但是和结点1直接貌似没联系了。
如果要接上1和3 不是要用操作 1.lchild=2.lchild 或者{ p=p->lchild; 1.lchild=p}
么?
if (!p) return FALSE; //不存在关键字等于key的数据元素
else {
if (EQ(key,T->data.key)) Delete(T); //找到关键字等于key的数据元素
else if (LT(key,T->data.key)) DeleteBST(T->lchild,key);
else DeleteBST(T->rchild,key)
return TRUE;
}
}//DeleteBST
其中删除操作过程如下所描述~~~
void Delete(BiTree &p) {
//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点p,并返回TRUE;否则返回FALSE
if (p->rchild) { q=p; p=p->lchild; free(q); }//右子树空只需要重接它的左子树
else if (!p->lchild) {q=p; p=p->rchild; free(q); } //左子树空只需要重接它的右子树
else { q=p; s=p->lchild;
while(!s->rchild) {q=s; s=s->rchild }
p->data=s->data;
if(q!=p) q->rchild=s->lchild ;
else q->lchild=s->lchild;
free(s);
}
}//Delete
我的疑问~针对左子树 或者 右子树 空的情况。
仅仅用p=p->lchild 怎么能接上呢?
就比如 树 1
2 <-p
3
假设要删除结点2.如果仅仅操作 p=p->lchild 有什么用 虽然p是指向了3但是和结点1直接貌似没联系了。
如果要接上1和3 不是要用操作 1.lchild=2.lchild 或者{ p=p->lchild; 1.lchild=p}
么?