问答题 假设在二叉链表的结点中增设两个域:parent域以指示其双亲结点;flag域(取值为0..2)以区分在遍历过程中到达该结点时应继续向左或向右或访问该结点。试以此存储结构编写不用栈进行后序遍历的递推形式的算法。【中南大学2004三、2(10分)】
【正确答案】正确答案:后序遍历二叉树是“左子树一右子树一根结点”,而查找结点的后继要通过双亲结点,因此设置结点结构为(1child,data,rchild,parent,flag)。遍历中当flag=0时置flag为1,并遍历左子树;当flag=1时置flag为2,并遍历右子树;当flag=2时访问结点,同时恢复flag=0,再去查找其双亲。核心语句段如下: while(p) switch(p一>flag) (case 0:P一>flag=1;if(p一>ichild)p=p->Ichild; //向左 break; case 1:p一>flag=2;if(p一>rchild)p=P一>rchild; //向右 break; case 2:p一>flag=0;printf(p一>data); //访问“根”结点 P=P一>parent; //找被访问结点的双亲 }//switch
【答案解析】