void DelBSTNode(BSTree *Tptr,KeyType key) {//在二叉排序树*Tptr中删去关键字为key的结点 BSTNode *parent=NUll,*p=*Tptr,*q,*child; while(p){ //从根开始查找关键字为key的待删结点 if(p->key==key) break;//已找到,跳出查找循环 parent=p; //parent指向*p的双亲 p=(keykey)?p->lchild:p->rchild; //在关p的左或右子树中继续找 } if(!p) return; //找不到被删结点则返回 q=p; //q记住被删结点*p if(q->lchild&&q->rchild) //*q的两个孩子均非空,故找*q的中序后继*p for(parent=q,p=q->rchild; p->lchild; parent=p,p=p=->lchild); //现在情况(3)已被转换为情况(2),而情况(1)相当于是情况(2)中child=NULL的状况 child=(p->lchild)?p->lchild:p->rchild;//若是情况(2),则child非空;否则child为空 if(!parent) //*p的双亲为空,说明*p为根,删*p后应修改根指针 *Tptr=child; //若是情况(1),则删去*p后,树为空;否则child变为根 else{ //*p不是根,将*p的孩子和*p的双亲进行连接,*p从树上被摘下 if(p==parent->lchild) //*p是双亲的左孩子 parent->lchild=child; //*child作为*parent的左孩子 else parent->rchild=child; //*child作为 parent的右孩子 if(p!=q) //是情况(3),需将*p的数据复制到*q q->key=p->key; //若还有其它数据域亦需复制 } //endif free(p); /释放*p占用的空间 } //DelBSTNode
追答哥们一直和我玩这个游戏呢,,应该早知道的 hmgk/www.25547.wang?oBsFw