地鼠安家 1
Description
fd 是一个公认的美丽校园。一天, fd 来了一群地鼠,编号为 1 到 n,他们希望 在这里定居。现在先由第一只地鼠往下打一个单位的距离,并且在那里安家。对 于每一个已经安家的地鼠,如果他左下或右下没有邻居,那还没安家的地鼠就可 以在他的左下或者右下安家。地鼠们已经建完所有的窝了,他们评价这些窝合格 的标准是它们能不能形成一棵二叉搜索树( 二叉搜索树的定义见课本)。现在需 要你帮助他们评估一下他们的窝挖的是否合格。
Input
第 1 行一个整数 n,表示地鼠总共 n 只。接下来一共 n 行,每一行三个数: l,o,r,其中 l 表示编号为 o 的地鼠的左邻居的编号, r 表示的是编号为 o 的右邻居的编号,如果没有左邻居或右邻居,则 l 或 r 为-1。 1<=n<=10000。 保证给出的是一颗二叉树。
Output
输出一行,如果如果他们的窝合格,则输出安居在最深的窝的地鼠离地面的距离,如果
不合格,则输出-1。
不合格,则输出-1。
Sample Input
5
-1 1 -1
1 2 3 -
1 3 -1
2 4 5
-1 5 -1
Sample Output
3
思路
二叉搜索树中序遍历得到的是一个严格上升序列,因此可以通过判断中序遍历的结果是否是上升序列来解,也可以在搜索的时候直接判断是否符合二叉搜索树的定义。
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10005;
int lson[maxn],rson[maxn],indeg[maxn];
bool flag = false;
void dfs(int fa)
{
if (lson[fa] != -1) dfs(lson[fa]);
if (lson[fa] != -1 && lson[fa] >= fa) flag = true;
if (rson[fa] != -1) dfs(rson[fa]);
if (rson[fa] != -1 && rson[fa] <= fa) flag = true;
}
int GetHeight(int fa)
{
if (fa == -1) return -1;
int lh = GetHeight(lson[fa]);
int rh = GetHeight(rson[fa]);
return lh>rh?++lh:++rh;
}
int main()
{
freopen("data.txt","r",stdin);
//freopen("1.txt","w",stdout);
int n,ls,fa,rs,i;
memset(lson,-1,sizeof(lson));
memset(rson,-1,sizeof(rson));
memset(indeg,0,sizeof(indeg));
scanf("%d",&n);
for (i = 0;i < n;i++)
{
scanf("%d%d%d",&ls,&fa,&rs);
lson[fa] = ls,rson[fa] = rs;
indeg[ls]++,indeg[rs]++;
}
int root;
for (i = 1;i <= n;i++)
{
if (!indeg[i])
{
root = i;
break;
}
}
dfs(root);
if (flag) printf("-1\n");
else printf("%d\n",GetHeight(root)+1);
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10005;
int p = 0,lson[maxn],rson[maxn],indeg[maxn],a[maxn];
void inorder(int x)
{
if (x != -1)
{
inorder(lson[x]);
a[p++] = x;
inorder(rson[x]);
}
}
int height(int x)
{
if (x == -1) return -1;
int lh = height(lson[x]);
int rh = height(rson[x]);
return lh>rh?++lh:++rh;
}
int main()
{
int i,n,l,r,fa;
memset(lson,-1,sizeof(lson));
memset(rson,-1,sizeof(rson));
memset(indeg,0,sizeof(indeg));
scanf("%d",&n);
for (i = 0;i < n;i++)
{
scanf("%d%d%d",&l,&fa,&r);
lson[fa] = l;
rson[fa] = r;
indeg[l]++;
indeg[r]++;
}
int root;
for (i = 1;i <= n;i++)
{
if (!indeg[i])
{
root = i;
break;
}
}
inorder(root);
bool flag = false;
for (i = 1;i < n;i++)
{
if (a[i] != a[i-1] + 1)
{
flag = true;
break;
}
}
if (flag) printf("-1\n");
else printf("%d\n",height(root)+1);
return 0;
}