题目:输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历结果。如果是返回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