【正确答案】由指示结点i左儿子和右儿子的两个一维数组L[i]和R[i],很容易建立指示结点i的双亲的一维数组T[i],根据T数组,判断结点U是否是结点V后代的算法转为判断结点V是否是结点U的祖先的问题。
int Generation(int U,V,N,L[],R[],T[]){
//L[]和R[]是含有N个元素且指示二叉树结点i左儿子和右儿子的一维数组
//本算法据此建立结点i的双亲数组T,并判断结点U是否是结点V的后代
int i;
for(i=1; i<=N; i++) T[i]=0; //T数组初始化
for(i=1; i<=N; i++) //根据L和R填写T
if(L[i] !=0) T[L[i]]=i; //若结点i的左子女是L,则结点L的双亲是结点i
for(i=1; i<=N; i++)
if(R[i] !=0) T[R[i]]=i; //i的右子女是R,则R的双亲是i
int parent=U; //判断U是否是V的后代
while(parent !=V && parent !=0) paren = T[parent];
if(parent == V){ printf("结点U是结点V的后代"); return(1); }
else{printf("结点U不是结点V的后代"); return(0); }
}//结束Generation
【答案解析】