二叉搜索树的后序遍历

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回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;
}

posted @ 2015-06-26 21:41  runninglzw  阅读(212)  评论(0编辑  收藏  举报