数据结构作业——地鼠安家(二叉搜索树)

地鼠安家 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。

Sample Input

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

Sample Output

3

思路

二叉搜索树中序遍历得到的是一个严格上升序列,因此可以通过判断中序遍历的结果是否是上升序列来解,也可以在搜索的时候直接判断是否符合二叉搜索树的定义。

 AC代码
#include
#include
#include
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
#include
#include
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;
}

  

  

转载于:https://www.cnblogs.com/ZhaoxiCheung/p/6015068.html

你可能感兴趣的:(数据结构作业——地鼠安家(二叉搜索树))