问答题

阅读下列函数说明和C函数,将应填入▁处的字句写在答题纸的对应栏内。
[函数5说明]
  函数DeleteNode(Bitree *r,int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为:
  typedef struct Tnode{
    int data; /*结点的键值*/
    struct Tnode *Lchild,*Rchild; / * 指向左、右子树的指针 * /
     }*Bitree;
在二叉查找树上删除一个结点时,要考虑三种情况:
①若待删除的结点p是叶子结点,则直接删除该结点;
②若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p;
③若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述①、②情况之一。[函数5]
int DeleteNode(Bitree *r,int e){
Bitree p=* r,pp,s,c;
while( (1) ){/ * 从树根结点出发查找键值为e的结点 * /
pp=p;
if(e<p->data) p=p->Lchild;
else p=p->Rchild
}
if(! p)return-1;/ * 查找失败 * /
if(p->Lchild && p->Rchild){/ * 处理情况③ * /
s= (2) ;pp=p;
while( (3) ){pp=s;s=s->Rchild;}
p->dara=s->data;P=s;
}
/ * 处理情况①、② * /
if( (4) )c=p->Lchild;
else c=p->Rchild
if(p==*r) *r=c;
else if( (5) )pp->Lchild=c;
else pp->Rchild=c;
free(p);
return 0;
}

【参考答案】

(1)p && p->data !=e或p&&(*p).data!=e
(2)p->Lchild或(*P).L......

(↓↓↓ 点击下方‘点击查看答案’看完整答案、解析 ↓↓↓)