万能百科  > 所属分类  > 

阅读下列C函数和函数说明,将应填入(n)处的字句写在对应栏内。【说明】 函数DeleteNode (Bitree *r,

阅读下列C函数和函数说明,将应填入(n)处的字句写在对应栏内。

【说明】

函数DeleteNode (Bitree *r, int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为:

typedef struct Tnode{

int data; /*结点的键值*/

struct Tnode *Lchild, *Rchild; /*指向左、右子树的指针*/

}*Bitree:

在二叉查找树上删除一个结点时,要考虑3种情况:

①若待删除的结点p是叶子结点,则直接删除该结点;

②若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p;

③若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述①、②情况之一。

【函数】

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->data=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!=NULL&&p->data!=e或p&&(*p).data!=e(2)p->Lchild或(*p).Lchild(3)p->Rchild或(*p).Rchild(4)p->Lchild或(*p).Lchild(5)pp->Lchid=p或p=(*pp).child(1)p &&p->data!=e;或p!=NULL&&p->data!=e或p&&(*p).data!=

词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。

标签