题目:输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历结果。如果是返回true,否则返回false。假设输入的数组的任意两个数字互不相同。
#include <iostream>
using namespace std;
bool ispreorder(int a[], int len)
{
if(a==NULL || len<=0)
return false;
int root = a[0];//数组第一个数字是二叉搜索树的根节点
int i;
for(i=1;i<len;i++)
{
if(a[i]>root)//i为二叉搜索树右子树的起始坐标
break;
}
int j = i;
for(;j<len;j++)
{
if(a[j]<root)//如果右子树中存在大于root的数字,则该数组不是前序遍历序列
return false;
}
bool left = true;//先设为true,防止没有左子树的情况
if(i>1)
left = ispreorder(a+1,i-1);//如果有左子树,则遍历左子树
if(!left)
return false;//如果左子树不正确,则无需遍历右子树,直接返回false
bool right = true;//先设为true,防止没有右子树的情况
if(i<len)
right = ispreorder(a+i,len-i);//如果有右子树,则遍历右子树
return left&&right;//返回左子树和右子树的与值
}
int main()
{
int a[] = {8,6,5,7,10,9,11};
int len_a = sizeof(a)/sizeof(int);
int b[] = {7,8,11,6};
int len_b = sizeof(b)/sizeof(int);
int i;
cout<<"数组a为:"<<endl;
for(i=0;i<len_a;i++)
cout<<a[i]<<" ";
cout<<endl;
bool flag;
flag = ispreorder(a,len_a);
if(flag)
cout<<"该数组是二叉搜索树的前序遍历序列"<<endl;
else
cout<<"该数组不是二叉搜索树的前序遍历序列"<<endl;
cout<<"数组b为:"<<endl;
for(i=0;i<len_b;i++)
cout<<b[i]<<" ";
cout<<endl;
flag = ispreorder(b,len_b);
if(flag)
cout<<"该数组是二叉搜索树的前序遍历序列"<<endl;
else
cout<<"该数组不是二叉搜索树的前序遍历序列"<<endl;
return 0;
}