/题目
//输入若干行,每一行输入家谱中的某个成员,而后输入其孩子的姓名(最多两个,二叉树),
//输入两个姓名
//输出,两人的关系,临近的祖先和相差的层次
#include<stdio.h>
#define max 100
struct node{
struct node *lchild;
struct node *rchild;
char name[20];
int deep;
int index;
}Nodes[max];
int index=0;
int GetFather(struct node *Node){
int i=0;
for(i=0;i<index-1;i++){
if(Nodes[i].lchild==Node||Nodes[i].rchild==Node){
return i;
}
}
return -1;
}
int GetFamily(struct node *Node1,struct node *Node2){
int layer1,layer2,father1,father2;
char name1[20],name2[20];
layer1=Node1->deep;
layer2=Node2->deep;
strcpy(name1,Node1->name);
strcpy(name2,Node2->name);
father1=GetFather(Node1);
father2=GetFather(Node2);
if(layer1==layer2){
if(father1==father2){
return father1;
}
else{
GetFamily(&Nodes[father1],&Nodes[father2]);
}
}
else if(layer1<layer2&&Node1->index!=father2){
GetFamily(Node1,&Nodes[father2]);
}
else if(layer1>layer2&&Node2->index!=father1){
GetFamily(&Nodes[father1],Node2);
}
else if(Node1->index==father2){
return father2;
}
else if(Node2->index==father1){
return father1;
}
}
int GetIndex(char c[20]){
int i=0;
for(i=0;i<100;i++){
if(strcmp(c,Nodes[i].name)==0){
return i;
}
}
return -1;
}
void CreateNode(char c[][20]){
int id,layer;
if(GetIndex(c[0])<0){
strcpy(Nodes[index].name,c[0]);
Nodes[index].index=index;
Nodes[index].deep=1;
id=index;
layer=1;
index++;
}
else{
id=GetIndex(c[0]);
layer=Nodes[id].deep;
}
if(c[1]!=NULL){
if(GetIndex(c[1])<0){
strcpy(Nodes[index].name,c[1]);
Nodes[id].lchild=&Nodes[index];
Nodes[index].index=index;
Nodes[index].deep=layer+1;
index++;
}
else{
Nodes[id].lchild=&Nodes[GetIndex(c[1])];
Nodes[GetIndex(c[1])].deep=layer+1;
}
}
if(c[2]!=NULL){
if(GetIndex(c[2])<0){
strcpy(Nodes[index].name,c[2]);
Nodes[id].rchild=&Nodes[index];
Nodes[index].index=index;
Nodes[index].deep=layer+1;
index++;
}
else{
Nodes[id].rchild=&Nodes[GetIndex(c[2])];
Nodes[GetIndex(c[2])].deep=layer+1;
}
}
}
void main(){
int i=0,isGoon=3,j=0,fatherIndex,serchIndex1,serchIndex2;
char serchNames[2][20];
while(isGoon){
char names[3][20];
printf("请输入第%d行:",i+1);
scanf("%s%s%s",names[0],names[1],names[2]);
CreateNode(names);
i++;
isGoon--;
}
for(i=0;i<index;i++){
printf("%d,%s,%d\n",Nodes[i].index,Nodes[i].name,Nodes[i].deep);
}
printf("输入两个需要查找关系的名字:\n");
scanf("%s%s",serchNames[0],serchNames[1]);
//查找关系
serchIndex1=GetIndex(serchNames[0]);
serchIndex2=GetIndex(serchNames[1]);
printf("相差的深度:%d",abs(Nodes[serchIndex1].deep-Nodes[serchIndex2].deep));
fatherIndex=GetFamily(&Nodes[serchIndex1],&Nodes[serchIndex2]);
puts("共同祖先:");
puts(Nodes[fatherIndex].name);
}