【正确答案】设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;
}
【答案解析】