算法与数据结构实验题 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;
}