问答题 设一棵二叉树采用二叉链表表示,编写一个算法,利用二叉树的前序遍历求任意指定的两个结点I和J间的路径和路径长度。
【正确答案】设I和J是树的两个结点,设从根结点A到结点I的路径是ABCDEI,从根结点A到结点J的路径是ABPQRJ,则从结点I到结点J的路径为IEDCBPQRJ,长度为8。在求解过程中可设置一个辅助数组DataType path[n]记录从结点I到结点J的路径,其容量n由#define声明;len返回路径长度。算法可借助Find_Print,求从根结点到结点I的路径(用path1记录),从根结点到结点J的路径(用path2记录)。算法代码如下: void PathLength_P_Q(BTNode *t,int p,int q,int path[],int &len) { //对有n个结点的二义树t作前序遍历,计算结点*p与结点*q之间的路径,通过len //返回路径长度,通过path[n]返回两个结点之间的路径,n由#define声明 int i,j,k,pc,qc; int *path1=(int*)malloc(n * sizeof(int)); int *path2=(int*)malloc(n * sizeof(int)); Find_Print(t,p,path1,1,pc); //从根到*p的路径记入path1,pc为个数 Find_Print(t,p,path2,1,pc); //A根到*q的路径记入path2,qc为个数 if(!pc ||! qc) //*p或*q中至少有一个不在树中 { len=0; return; for(i=0;i<pc && i<qc;++i) //跳过公共祖先 if(path1[i] !=path2[1]) break; for(j=pc-1,k=1;j>=i-i;--j,++k) //连接结点之间路径 path[k]=path1[j]; for(j=i;j<qc;++j,++k) path[k]=path2[j]; len=k; }
【答案解析】