二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

不是很懂, 待解决

大体思路是找数组中比最后一个元素大的第一个元素的位置, 这个元素之后的所有元素要比最后一个元素大, 否则返回false, 解题有递归版和非递归版, 均源自牛客网, 不过原版中把自增都写入while循环中, 貌似有些问题

递归版:

class Solution {
public:
    
    bool isLastOrder(vector<int> sequence, int b, int e) {
        if (b == e) {
            return true;
        }
        int mid = b;
        while(sequence[mid] < sequence[e] && mid < e) 
            mid++;
        int temp = mid;
        while(sequence[temp] > sequence[e] && temp < e)
            temp++;
        if (temp < e){
            return false;
        }
        if(mid == e || mid == b) {
            return isLastOrder(sequence, b, e - 1);
        }
        else {
            return isLastOrder(sequence, b, mid - 1) && isLastOrder(sequence, mid, e - 1);
        }
    }
    
    bool VerifySquenceOfBST(vector<int> sequence) {
        if (sequence.empty()) {
            return false;
        }
        
        return isLastOrder(sequence, 0, sequence.size() - 1);
    }
};

非递归版:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(0 == sequence.size()) {
            return false;
        }
        
        int i = sequence.size();
        int j = 0;
        while(--i) {
            while((sequence[j] < sequence[i]) && j < i)    j++;
            while((sequence[j] > sequence[i]) && j < i)    j++;
            if (j != i)    return false;
            else {
                j = 0;
            }
        }
        
        return true;
    }
};
原文地址:https://www.cnblogs.com/hesper/p/10579311.html