题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ /
6 10
/ / / /
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
分析:后续遍历的结果使得根节点放在最后;如果一棵树是二叉搜索树,则它的根节点大于左子树中的所有节点,小于右子树中的所有节点,且它的左子树和右子树都是二叉搜索树。 首先根据于根节点的大小比较分出左子树与右子树,递归判断左右子树是否是二叉搜索树。
#include <iostream>
using namespace std;
bool IsOrderTree(int a[],int n)
{
int key=a[n-1];
bool isless=true;
int statu=0;///ָʾisless±ä»¯Á˼¸´Î
int index=0;///¼Ç¼·Ö¸îµã
if (n==1)
return true;
for (int i=0;i<n;i++)
{
if (isless && a[i]>key)///ÕÒµ½rootµÄÓÒ×ÓÊ÷
{
isless=false;
statu++;
index=i;
}
else if (!isless && a[i]<key)
{
isless=true;
statu++;
}
}
if (statu>1)
return false;
bool left=true,right=true;
if (index>0)
left=IsOrderTree(a,index);
if (n-1-index>0)
right=IsOrderTree(a+index,n-1-index);
return (left && right);
}
void main()
{
//int a[7]={5,7,6,9,11,10,8};
int a[9]={5,1,7,2,6,9,11,10,8};
//int b[4]={7,4,6,5};
cout<<IsOrderTree(a,9)<<endl;
}