数据结构:输入一个整数数组,判断它是否为某二叉搜索树的后序遍历,如果是输出YES,否则输出NO,假设数组内任意两个数都不相等

问题描述:

           输入一个整数数组,判断它是否为某二叉搜索树的后序遍历,如果是输出YES,否则输出NO,假设数组内任意两个数都不相等

还是先从概念入手:

二叉搜索树:

它可能是一颗空树

若不是空树,则满足:

1.若左子树不为空,则左子树上所有结点的值均小于根结点的值

2.若右子树不为空,则右子树上所有结点的值均大于根结点的值

3.左、右子树也分别是二叉搜索树

一颗树的后序遍历是以 根结点--->左结点----->右结点的顺序遍历的,那么我们可以得出数组的最后一个元素一定是这棵树的根结点

再因为二叉搜索树的左子树的结点的值一定小于根结点的值,右子树的结点的值一定大于根结点的值,所以数组中小于最后一个元素的一定是该树的左子树上的结点,大于最后一个元素的一定是该树右子树上的结点,而且一定是数组的前半部分小于根结点的值,后半部分大于根结点的值,我们只需找出这三种值(根结点的值、小于根结点的值、大于根结点的值)即可

继续根据概念下手,二叉搜索树的左右子树都是一棵二叉搜索树,所以再重复上面的思路

具体思路:

1.从数组中找到根结点  a[n-1];

2.从数组中第一个元素找到第一个大于根结点的元素 a[i];

3.从a[i] 到 a[n-2] 如果有大于a[n-1],则false,没有,continue

4.如果i>0,说明这棵树有左子树,判断a[0,1,...,i-1],重复1.2.3的步骤

5.如果i<n-1,则说明这棵树有右子树,判断a[i,i+1,....n-2],重复1.2.3的步骤

6.如果 4 == true && 5 == true,return true 否则 return false

代码:

 bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return false;
        int len = sequence.size();
        vector<int>left;
        vector<int>right;
        
        int i = 0;
        for(;i<len-1;i++){
            if(sequence[i]<sequence[len-1])
                left.push_back(sequence[i]);
            else
                break;
        }
        for(;i<len-1;i++){
            if(sequence[i]>sequence[len-1]){
                right.push_back(sequence[i]);
            }else{
               return false;
            }
        }
        bool left1=true,right1=true;
        if(!left.empty())
            left1 = VerifySquenceOfBST(left);
        if(!right.empty())
            right1 = VerifySquenceOfBST(right);
        return left1&&right1;
    }

猜你喜欢

转载自blog.csdn.net/LSFAN0213/article/details/81705027