★实验任务
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;
}