【正确答案】本题先采用非递归算法,在一棵二叉排序树查找到以x为根结点的子树p以及p的父结点q和标识p是q左子树或右子树的flag。对于要删除的子树p,还要调用dispose()函数释放其空间。dispose()函数采用递归后序遍历算法释放二叉树中每个结点的空间(实际上,该函数适合于任意一个二叉树的空间释放)。实现本题功能的程序代码如下:
void dispose(BTNode *&b)
{
if(b!=NULL)
{
dispose(b→left);
dispose(b→right);
free(b);
}
}
void del(BTNode *&t,int x) //删除以x为根的子树
{
BTNode *p=t,*q; //q保存p的父结点
int flag; //flag指出p是q的左结点(0),还是右结点(1)
if(t→data==x) //删除整个树
t=NULL;
else
{
do
{
if(x>p→data)
{
q=p;
p=p→right;
flag=1;
}
else if(x<p→data)
{
q=p;
p=p→left;
flag=0;
}
}while(p→data!=x);
}
switch(flag)
{
case 0:q→left=NULL;dispose(p);break;
case 1:q→right=NULL;dispose(p);break;
}
}
【答案解析】