1302: PIPI的族谱(二叉树)

题目描述

PIPI最近在看家里的族谱,发现族谱刚好组成了一棵二叉树,现在PIPI想询问族谱中的两个结点是否为兄弟或者堂兄弟。 
兄弟: 深度相同, 双亲节点相同(同一个结点不能是兄弟)。 
堂兄弟: 深度相同,双亲节点不同。 

输入

第一行按照先序输入族谱代表的二叉树,其中空节点用 -1 表示。 
第二行输入两个数字 x y,代表询问的两个结点的值。 

输出

若询问的两个结点是兄弟,输出"brother" , 若询问的两个结点是堂兄弟,输出"cousin" ,否则输出"other relathionship" 
(relationship写错了 , 请同学们直接复制"other relathionship") 

样例输入

1 2 -1 4 -1 -1 3 -1 5 -1 -1
4 5

样例输出

cousin
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct BiNode{
	int data;
	struct BiNode *lchild;
	struct BiNode *rchild;
}*BiTree; 
//创建一棵二叉树
void CreateTree(BiTree &T){
	int data;
	scanf("%d",&data);
	if(cin.get()!='\n'){
		if(data==-1){
			T=NULL;
		}else{
			T=(BiTree)malloc(sizeof(BiNode));
			T->data=data;
			CreateTree(T->lchild);
			CreateTree(T->rchild);
		}
	}
}  
//获取x父结点所在层次和父结点的值 
void Findnode(char x, BiTree T,BiTree father,BiTree &father_need,int height,int &height_need){
	if (T != NULL){
		if (T->data == x){
			height_need=height;
			father_need = father;
			return;
		}else{
			father = T;
		}
		Findnode(x, T->lchild, father, father_need,height + 1,height_need);
		Findnode(x, T->rchild, father, father_need,height + 1,height_need);
	}
}
int main(void){
	BiTree T; 
	CreateTree(T);
	int A,B;
	scanf("%d%d",&A,&B);
	if(A==B){
		printf("other relathionship\n");
	}else{
		BiTree fatherA = NULL,fatherB = NULL;//重点在于先将父节点置空
		BiTree neededA = NULL,neededB = NULL;//将待查节点置空
		int heightA = 0,heightB = 0;//高度初始化为0
		Findnode(A, T, neededA, fatherA, 1, heightA);//使用查找函数
		Findnode(B, T, neededB, fatherB, 1, heightB);
		if(heightA==heightB){//深度相同 
			if(fatherA->data==fatherB->data){//A与B父结点相同 
				printf("brother\n");
			}else{//深度不同 
				printf("cousin\n"); 
			}
		}else{
			printf("other relathionship\n");
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
家谱管理系统,主要用来管理家族成员的基本信息 1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。 4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数 6、若家谱树为空,则新建家谱树。实现成员节点的添加。基本功能中可以 强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。 7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。 8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱树保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。 12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。 13、按姓名查询家谱成员并显示该成员的各项信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。 15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。 16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。 17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。 18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成 员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面. 19、查询某一成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。 21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值