算法与数据结构实验题 10.1 地鼠安家 1 (二叉搜索树)

1、题目:


2、解题思路:

找到根节点,还原二叉树,根据二叉树的中序排列,判断是否为递增序列,只要是递增序列就是二叉搜索树,否则不是。值得注意的是,如果左右子树均为空也是二叉搜树。

3、代码:

#include<iostream>
using namespace std;
int a[10010],h=0;
struct Node
{
	int data;
	int left;
	int right;
} node[10010];
int InOrder(int m)
{
	if(m!=-1)
	{
		InOrder(node[m].left);
		a[h]=m;
		h++;
		InOrder(node[m].right);
	}
	return h;
}

int Height(int m)
{
	int hl,hr;
	if(m==-1)
	{
		return 0;
	}
	hl=Height(node[m].left);
	hr=Height(node[m].right);
	if(hl>hr)
	{
		return ++hl;
	}
	else return ++hr;
}
int main()
{
	int n;
	cin>>n;
	int l,o[10010],r,i,j;
	for(i=0; i<n; i++)node[i].left=node[i].right=-1;
	for(i=0; i<n; i++)
	{
		cin>>l>>o[i]>>r;
		node[o[i]].left=l;
		node[o[i]].right=r;
	}
	int root=0;
	for(i=0; i<n; i++)
	{
		int num=0;
		for(j=0; j<n; j++)
		{
			if(o[i]!=node[o[j]].left&&o[i]!=node[o[j]].right)
			{
				num++;
			}
			else
			{
				break;
			}
		}

		if(num==n)
		{
			root=o[i];
			break;
		}
	}
	//左右子树均为空
	if(node[root].left==-1&&node[root].right==-1)
	{
		cout<<"1"<<endl;
	}
	else
	{
		InOrder(root);
		int count=0;
		for(i=0; i<h-1; i++)
		{
			if(a[i+1]<=a[i])
			{
				cout<<"-1"<<endl;
				break;
			}
			else
			{
				count++;
			}
		}
		if(count==h-1)
		{
			cout<<Height(root)<<endl;
		}
	}

	return 0;
}
posted @ 2016-10-31 11:18  laixl  阅读(740)  评论(0编辑  收藏  举报