问答题 二叉排序树采用二叉链表存储。写一个算法,删除结点值是X的结点。要求删除该结点后,此树仍然是一棵二叉排序树,并且高度没有增长(注:可不考虑被删除的结点是根的情况)。【中科院软件所1999七、1(8分)】
【正确答案】正确答案:在二叉排序树上删除结点,首先要查找该结点。查找成功后,若该结点无左子树,则可直接将其右子树的根结点接到其双亲结点上;若该结点有左子树,则将其左子树中按中序遍历的最后一个结点代替该结点,从而不增加树的高度。核心语句段如下: while(p&&P一>key!=x) //查找值为X的结点 if(p一>key>X){f=p; P=p一>lchild;} else(f=p;p=p一>rchild;} if(p==null)(Cout<<“无关键字为X的结点”<lchild=:null) //被删结点无左子树 if(f一>lchild:==p)f一>lchild=p一>rchild; //将被删结点的右子树接到其双亲上 else f一>rchild=p一>rchild; else{q=p; s=p一>lchild; //被删结点有左子树 while(s一>rcchild!=null) //查左子树中最右下的结点(中序最后结点) (q=s; s=s一>rchild;) P一>key=s一>key; //结点值用其左子树最右下的结点的值代替 if(q==p)P一>ichild=s一>ichild; //被删结点左子树的根结点无右子女 else q一>rchild:s一>ichild; //s是被删结点左子树中序序列最后一个结点 delete(s); } //else结束,被删结点有左子树
【答案解析】