问答题 已知一具有n个结点的二叉树的中序遍历序列与后序遍历序列分别存放于数组IN[L,n]和POST[L.n]中(设该二叉树各结点的数据值均不相同)。请写一建立该二叉树的二叉链表结构的非递归算法。该二叉链表的链结点结构为(lchild,data,rchild),其中data为数据域,lchild与rchild分别为指向该结点左、右孩子的指针域(当孩子结点不存在时,相应指针域为空,用NULL表示)。【北京航空航天大学2003年】
【正确答案】正确答案:算法的基本设计思想:开始时考查整个中序序列和后序序列,将中序序列和后序序列的起始信息封装到结构体中,入栈。当栈不为空时,循环执行操作:取出栈顶元素,按照结构体所指示出的两段序列,将元素的结点赋值为后序序列的最后一个结点;若此结点有左子树,挂接左孩子并将左子树的中序和后序信息封装入栈;若有右子树,挂接右孩子并将右子树中序和后序信息入栈。直到栈空为止。算法的代码: typedef Struct{ int 11 l h1 t 12,h2; BiTree t; }node; void InPostCreat(ElemType IN[],ElemType POST[],int 1].,int hl,int 12,int h2){ //由二叉树的中序序列IN[]和后序序列POST[]建立二叉树,11、h1和12、h2分别 //是中序序列和后序序列第一和最后元素的下标,初始调用时,11=12=1、hl=h2=n node S[],P; //s是栈,容量足够大 BiTree bt=(BiTree)mellOC(SiZeof(BiNode)); int top=0,i; P.11=11; //初始化 P.h1=h1; P.12=12; P.h2=h2; P.t=bt; S[++top]=P; while(top>0) { p=s[top一一]; //取出栈顶数据 bt=P.t; 11=p.11; h1=P.h1; 12=p.12; h2=p.h2; for(i=11;i<=h1;i++) //在中序序列中查等于POST[h2]的结点 if(IN[i]==POST[h2]) break; bt一>data:POST[h2]; //根结点的值 if(i==11) bt一>1child=NULL; //bt无左子树 e1Se { bt一>1child=(BiTree)malloc(Sizeof(BiNode)); P.t=bt一>1chiid; P.11=11; P.h1=i一1; P.12=12; P.h2=12+i—11一1; S[++top]=p; //将建立左予树的数据入栈 } if(i==h1) bt一>rchild=NULL; //bt无右子树 e1Se { bt一>rchild=(BiTree)mallOC(SiZeof(BiNode)); P.t=bt一>rchiid: P.11=i+1: P.h1=h1; P.12=12+i一11: P.h2=h2—1; S[++top]一p; //右子树数据入栈 } }//while(top>0) }// InPostCreat
【答案解析】