题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
例如输入数组{5,7,6,9,11,10,8},则返回true,如果输入的数组是{7,4,6,5},则返回false。
思路:
因为该序列的最后一位肯定是二叉搜索树的根结点,并且前面的序列为根结点的左子树,比根结点小,后面的序列为根结点的右子树,比根结点大。
所以可以从头遍历该序列直到找到比根结点大的下标,然后从该下标开始遍历到length-1,如果有一个数比根结点小则返回false,如果都比根结点大则递归判断左右子树,左右子树都符合条件才返回true;
代码如下:
#include<iostream> using namespace std; bool isorder(int *data,int length) { //判断边界条件 if(data==NULL||length<=0) { return false; } //保存根节点值 int root=data[length-1]; //找到第一个大于根节点的值,往后的值都大于根节点,否则返回false int i=0; for(;i<length-1;i++) { if(root<data[i]) break; } for(int j=i+1;j<length-1;j++) { //如果i之后的数字有一个小于根节点,则不满足后序遍历,返回false if(data[j]<root) return false; } //如果存在左子树,则递归判断左子树 bool left=true; if(i>0) { left=isorder(data,i); } //如果存在右子树,递归判断右子树 bool right=true; if(i<length-1) { right=isorder(data+i,length-i-1); } return left&&right; }
测试代码及运行结果:
int main() { int data[]={5,7,6,9,11,10,8}; cout<<"是否是二叉搜索树的后序遍历:"<<(isorder(data,7)?"true":"false")<<endl; return 0; }