研究了根据输入的数组,判断数组是不是某个BST的后序遍历序列,现在写出自己的“判断输入的数组是不是某个BST的前序遍历序列”,实现代码如下:
#include<iostream>
using namespace std;
bool VerifyPreSquenceOfBST(int sequence[], int length)
{
if(sequence == NULL || length <= 0)
return false;
if (length==1)
return true;
int root = sequence[0];
// 在二叉搜索树中左子树的结点小于根结点
int i = 1;
for(; i < length; ++ i)
{
if(sequence[i] > root)
break;
}
// 在二叉搜索树中右子树的结点大于根结点
int j = i;
for(; j < length; ++ j)
{
if(sequence[j] < root)
return false;
}
// 判断左子树是不是二叉搜索树
bool left = true;
if(i > 1)
left = VerifyPreSquenceOfBST(sequence+1, i-1);//注意细节
// 判断右子树是不是二叉搜索树
bool right = true;
if(i < length)
right = VerifyPreSquenceOfBST(sequence + i, length - i);//注意细节
return (left && right);
}
int main()
{
//int data[] = {10};//只含根节点
//int data[] = {10,9};//只含左子节点
//int data[] = {10,9,8};
//int data[] = {10,12};//只含右子节点
//int data[] = {10,12,14};
//int data[] = {10,11,12};//只含一个左右子节点
//int data[] = {10,6,4,8,14,12,16};//含多个左右子节点
int data[] = {10,6,11,12,9};//错误测试
bool flag = VerifyPreSquenceOfBST(data, sizeof(data)/sizeof(*data));
if (flag)
cout<<"yes!"<<endl;
else
cout<<"no!"<<endl;
return 0;
}