问答题 试写出复制一棵二叉树的算法。二叉树采用标准链接结构。【山东大学2000二(10分)】
【正确答案】正确答案:由二叉树的中序序列和层次序列可以唯一确定该二叉树,其手工描述见上面应用题的63题,限于篇幅,这里不再画出该二叉树,只分析生成二叉树的算法。层次序列第一个结点是二叉树的根,在中序序列中“根”将二叉树分成左右子树两部分。但在层次序列中,左子树的结点和右子树的结点混在一起,不能一眼分出每个结点属于左子树还是属于右子树。应从层次序列第2个(第1个是根)结点起,逐个到二叉树的左子树部分比对,形成左子树的层次遍历序列。同样,也可形成右子树的层次遍历序列。实现时可利用两个一维数组,分别存放左右子树的层次序列。设二叉树的层次序列和中序序列分别用level[0..n一1]和in[0.n一1]表示,再设根结点在中序序列中下标是i(0≤i≤n一1),则左、右子树层次序列和中序序列都可以用数组表示。算法的核心语句如下:BiTree creat(EiemType level[],in[],int 11,h1,12,h2)//二叉树的层次序列和中序序列生成二叉树。初始11=12=0,h1=h2=n一1,n是结点数 {bt=new(BiNode); bt一>data=level[11]; //层次序列的第一个结点是二叉树的根 for(i=12ji<=h2;i++) //在中序序列中查找二叉树的根 if(1evel[11]==in[i])break; if(i==12)bt一>ichild=null; //二叉树无左子树 else{for(k=11+1;k<=h1;k++) //找层次序列中的左子树的结点 for(J=12;jIchild=Creat(1evell,in,0,ii,II,i一1);//生成左子树 } if(i==h2)bt一>rchild=null; //二叉树无右子树 else{for(k=11+1;k<=h1;k++) //查找层次序列中的右子树的结点 for(j=i+1; j<=h2;j++) //右子树中序序列下标从i+1到n一1 if(1evel[k]==in[j]) levell[++ii]=level[k],//右子树层次序列,ii初值为一1 bt->rhild=Creat(1evell,in,0,ii,i+l,h2);//生成右子树 } return bt; } BiTree Copy(BiTree t) //复制.-X树t的递归算法 {BiTree bt; if(t==null)bt=null; else{bt=new(BiNode); bt一>data=t一>data; bt一>lchild=C0py(t一>l child); bt一>rchild=Copy(t->rchiid); } return(bt); }//结束Copy
【答案解析】