算法与数据结构实验题 6.25 地鼠安家 1

★实验任务

fd 是一个公认的美丽校园。一天,fd 来了一群地鼠,编号为 1 到 n,他们希望 在这里定居。现在先由第一只地鼠往下打一个单位的距离,并且在那里安家。对 于每一个已经安家的地鼠,如果他左下或右下没有邻居,那还没安家的地鼠就可 以在他的左下或者右下安家。地鼠们已经建完所有的窝了,他们评价这些窝合格 的标准是它们能不能形成一棵二叉搜索树。现在需要你帮助他们评估一下他们的 窝挖的是否合格。

★数据输入

第 1 行一个整数 n,表示地鼠总共 n 只。接下来一共 n 行,每一行三个数:l,o,r,其中 l 表示编号为 o 的地鼠的左邻居的编号,r 表示的是编号为 o 的右邻居的编号,如果没有左 邻居或右邻居,则 l 或 r 为-1。1<=n<=10000。

★数据输出

输出一行,如果如果他们的窝合格,则输出安居在最深的窝的地鼠离地面的距离,如果不合格,则输出-1。

输入示例

5
-1 1 -1
1 2 3
-1 3 -1
2 4 5
-1 5 -1
输出示例

3

#include<stdio.h>
#include<stdlib.h>
typedef struct TNode *tree;
struct TNode{
	int left,right,data;
};

int flag=1;

tree Createtree(int n){
	tree t=(tree)malloc(sizeof(struct TNode)*(n+1));
	int i;
	for(i=0;i<n+1;i++){
		t[i].data=-1;
		t[i].left=-1;
		t[i].right=-1;
	}
	return t;
}

void Travl(tree t,int root){
	if(root!=-1){
		Travl(t,t[root].left);
		if((t[root].left!=-1)&&(t[root].data<t[t[root].left].data))
			flag=0;
		if((t[root].right!=-1)&&(t[root].data>t[t[root].right].data))
			flag=0;
		//printf("%d %d %d\n",t[root].data,t[root].left,t[t[root].right].data);
		Travl(t,t[root].right);
	}
	return ;
}

int getheight(tree t,int root){
	if(root==-1)
		return 0;
	int hl = getheight(t,t[root].left);
	int hr = getheight(t,t[root].right);
	return (hl>hr?(hl+1):(hr+1));
}

int main(void){
	int n,i;
	scanf("%d",&n);
	tree t=Createtree(n+1);
	int check[n+1];
	for(i=0;i<n+1;i++){
		check[i]=-1;
	}
	int l,o,r;
	for(i=0;i<n;i++){
		scanf("%d%d%d",&l,&o,&r);
		t[o].data=o;
		t[o].left=l;
		t[o].right=r;
		check[l]=check[r]=1;
	}
	for(i=1;i<n+1;i++){
		if(check[i]==-1)
			break;
	}
	int root=i;
	Travl(t,root);
	int h=getheight(t,root);
	if(flag==1)
		printf("%d",h);
	else
		printf("-1");
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值