问答题 有一棵二叉排序树r,设计一个非递归算法删除以x为根结点的子树,并释放这些被删结点的空间。
【正确答案】本题先采用非递归算法,在一棵二叉排序树查找到以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; } }
【答案解析】