您的位置:首页 > 其它

判断二叉搜索树的后续遍历序列

2013-06-17 15:45 169 查看
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

#include <iostream>
using namespace std;

bool ispostorder(int a[], int len)
{
if(a==NULL || len<=0)
return false;
int root = a[len-1];//数组最后一个数字是二叉搜索树的根节点
int i;
for(i=0;i<len-1;i++)
{
if(a[i]>root)//i为二叉搜索树右子树的起始坐标
break;
}
int j = i;
for(;j<len-1;j++)
{
if(a[j]<root)//如果右子树中存在大于root的数字,则该数组不是后续遍历序列
return false;
}
bool left = true;//先设为true,防止没有左子树的情况
if(i>0)
left = ispostorder(a,i);//如果有左子树,则遍历左子树
if(!left)
return false;//如果左子树不正确,则无需遍历右子树,直接返回false
bool right = true;//先设为true,防止没有右子树的情况
if(i<len-1)
right = ispostorder(a+i,len-1-i);//如果有右子树,则遍历右子树
return left&&right;//返回左子树和右子树的与值
}

int main()
{
int a[] = {5,7,6,9,11,10,8};
int len_a = sizeof(a)/sizeof(int);
int b[] = {7,4,6,5};
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 = ispostorder(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 = ispostorder(b,len_b);
if(flag)
cout<<"该数组是二叉搜索树的后续遍历序列"<<endl;
else
cout<<"该数组不是二叉搜索树的后续遍历序列"<<endl;
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: