9.判断1个整数序列是不是二叉查找树的后续遍历结果

题目: 输入整数序列,判断该数组是不是某个二叉查找树的后续遍历结果,是返回true,不是返回false.

解: 二叉查找树中有左孩子<=父节点<右孩子,所以如果1个序列是2叉查找树的后续遍历结果的话,那么最后1个元素就是根,以数组5,7,6,9,11,10,8说明,假设它是的话,那么8就是这棵树的根,从头开始遍历直到>8的元素为止,前面的元素都属于左孩子,后面的元素除了末尾都属于右孩子,因为这是我们已经判断左孩子的节点都<=8,那么就在右孩子中遍历,如果元素有小于8的,就不满足二叉查找树性质,返回false了;如果都>8,那么继续判断左孩子和右孩子是不是二叉查找树的后续遍历,当且仅当左右孩子都是时,那么这个数组序列就返回true,否则返回false

代码:

#include<iostream>
using namespace std;

//判断a[begin]->a[end]是不是
bool isbt(int* a,int begin,int end)
{
    //单节点是的
    if(begin>=end)
        return true;
    else if(begin<end)
    {
        int root=a[end];
        int i,j,p=begin;
        for(i=begin;i<end;)
            if(a[i]<=root)
                i++;
            else //a[i]>root即到右子树的第一个节点
                break;

        p=i;
        //现在判断右子树的节点是不是都>root,如果不是的话,那么直接不是2叉查找数,如果是的话,看左右孩子
        bool isnot=false;
        for(j=i;j<end;j++)
            if(a[j]<root)
                isnot=true;
        //如果正是不是
        if(isnot)
            return false;

        //下面看左右孩子是不是了
        bool leftis=isbt(a,begin,p-1);
        bool rightis=isbt(a,p,end-1);
        //如果左右孩子都是
        if(leftis && rightis)
            return true;
        else
            return false;
    }
}


int main(void)
{
    int a[]={5,7,6,9,11,10,8};
    int b[]={7,4,6,5};

    //bool flag=isbt(a,0,6);
    bool flag=isbt(b,0,3);
    if(flag)
        cout<<""<<endl;
    else
        cout<<"不是"<<endl;
    return 0;
}

 

posted on 2013-07-20 20:11  紫金树下  阅读(264)  评论(0编辑  收藏  举报