题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。
例如数组{5,7,6,9,11,10,8},就是下述的二叉树的后序遍历。
基本思想:
后序遍历中,最后一个数字是树的根节点,数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。
{5,7,6}比8小,{9,11,10}比8大。接下来用同样的方法确定与数组每一部分对应的子树的结构,递归过程。
#include <iostream>
using namespace std;
bool foo(int a[],int len)
{
if(a==NULL || len<=0)
return false;
int root=a[len-1];
//在二叉树中左子树的节点小于根节点
int i=0;
for(;i<len-1;++i)
{
if(a[i]>root)
break;
}
//在二叉树中右子树的节点大于根节点
int j=i;
for(;j<len-1;++j)
{
if(a[j]<root)
return false;
}
//判断左子树是不是二叉树
bool left=true;
if(i>0)
left=foo(a,i);
//判断右子树是不是二叉树
bool right=true;
if(i<len-1)
right=foo(a+i,len-i-1);
return (left&&right);
}
void main()
{
int a[]={5,7,6,9,11,10,8};
int lenA = sizeof(a)/sizeof(a[0]);
int b[]={7,4,6,5};
int lenB=sizeof(b)/sizeof(b[0]);
cout<<foo(a,lenA)<<endl;
cout<<foo(b,lenB)<<endl;
}