问答题 设二又排序树的存储结构为:TYpE tree=^node:node=RECORD key: keytype; size:int; lchild, rchild, parent8: tree;END;一个结点x^的size域的值是以该结点为根的子树中结点的总数(包括x^本身)。例如,下图中x所指结点的size值为4。设树高为h,试写一时间为O(h)的算法Rank(T:tree;x:^node)返回x所指结点在二叉排序树T的中序序列里的排序序号,即求x^结点是根为T的二叉排序树中第几个最小元素。例如,下图x所指结点是树T中第11个最小元素。(提示:你可利用size值和双亲指针parents)【中科院软件所1997四(12分)】【中国科学技术大学1997 (10分)】
【正确答案】正确答案:设r是以*x为根的中序序号。初始时,若X的左子树为空,r=1;否则,r=>lchild一>size+1。 利用结点的双亲域,上溯至根结点,可得答案r。核心语句段如下: if(x一>ichild)r=x一>Ichild一>size+1;else r=1; //x的这个序号是暂时的 p=x;//p要上溯至根结点T,求出*x的中序序号 while(p!=T) (if(p==p一>parents一>rchild) //p是其双亲的右子女 (if(p一>parents一>ichild==null)r++; //P结点的双亲排在P结点的前面 else r=r+p一>parent一>ichild一>size+1; //;X亲及左子树均排在P前面 } p=p->parents ; //找P的双亲 }//while 另一算法是从根往下查找结点*x。若T的左子树为空,则根的中序序号为1,否则为 T->lchild一>size+1。设T的中序序号为r,其左子女P的中序序号和右子女q的中序序号分别为r-p一>rchild一>size一1和r+q一>lchild一>size+1。核心语句段如下: if(T一>ichild) r=T一>ichild一>size+1;else r=1; //根结点的中序序号r while(T) if(T一>key>x一>key) //到左子树去查找 {T=T一>ichild; if(T){if(T-->rchild)r=r—T一>rchild一>size-1;else r=r一1) } else if(T一>keykey) //到右子树去查找 {T=T一>rchild; if(T){if(T一>Ichild)r=r+T一>ichild一>size+l;else r=r+l;} } else return(r);//T一>key==x一>key,返回*x结点的中序序号
【答案解析】