北航计算机2017年复试-机试第3题

/题目
//输入若干行,每一行输入家谱中的某个成员,而后输入其孩子的姓名(最多两个,二叉树),
//输入两个姓名
//输出,两人的关系,临近的祖先和相差的层次
#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);

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值