问答题 写出按后序序列遍历中序线索树的算法。【东南大学2000六(15分)】
【正确答案】正确答案:上题讨论了中序线索树中查找结点p的后序后继问题,本题要求在中序线索树上进行后序遍历。因后序遍历是“左一右一根”,最后访问根结点,即只有从右子树返回时才能访问根结点,为此设一标志flag,当其为1时表示从右侧返回,可以访问根结点。为了找当前结点的后继,需知道双亲结点的信息,在中序线索树中,某结点最左子孙的左线索和最右子孙的右线索均上指双亲或祖先,因此设立两个函数LeftMost和RightMost求结点的最左和最右子孙,为了判定是否是从右子树返回,再设一函数IsRightChild。下面是求结点t最左子孙的左线索: BiThrTree p=t; while(p一>Itag==0)p=p一>Ichild; //沿左分支向下 if(p->ichild!=null)return(p一>Ichild); else return(null); 下面是求结点t最右子孙的右线索: BiThrTree p=t; while(p一>rtag==0)p=p一>rchild; //沿右分向下 if(p->rchild!=null)return(p一>rchild); else return(null); 下面的函数,若t是father的右孩子返回1,否则返回0 int IsRightChild(BiThrTree t,father) (father=LeftMost(t); if(father&&father一>rchiid==t)return(1); else return(0); } void PostOrderInThr(BiThrTree bt) //后序遍历中序线索二叉树bt {BiThrTree father,p=bt;int flag; while(p!=null) {while(p一>itag==0)p=P一>ichild; //沿左分支向下 if(p一>rtag==0)flag=0 ; //左孩子为线索,右孩子为链,相"-3于从左返回 else flag=1 ; lip为叶子,相当于从右返回 while(flag==1) {visit(+p); //访问结点 if(IsRightChild(p,father)){p=father;flag=1;)//修改P指向双亲 else //p是左子女,用最右子孙的右线索找双亲 {p=RightM。st(p); if(p&&p一>rtag==1)flag=l;else flag=0 ;} }//while(flag==1) if(flag==0&&P!=null)p--p一>rchild;//转向当前结点右分支 } }//结束PostorderInThr
【答案解析】