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

剑指OFFER题24------按牛客网热度排序

时间:2018.11.21.1950
作者:Waitt

题目

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

时间限制:1秒 空间限制:32768K 热度指数:291190

解答

链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
来源:牛客网

BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:
T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义。

class Solution {
public:
	//当向量不为空时的解法函数。
    bool VerifySquenceOfBS(vector<int> sequence) {
        if(sequence.empty())
            return 1;
        int n=sequence.size();
        vector<int> l,r;
        //标志位
        int i=0;
        //左子树向量
        while(sequence[i]<sequence[n-1]&&i<n)
        {
            l.push_back(sequence[i]);
            i++;
        }
        //右子树向量
        while(sequence[i]>sequence[n-1]&&i<n)
        {
            r.push_back(sequence[i]);
            i++;
        }
        //当标志位不为n-1时,说明该序列不为二叉搜索树的后续遍历。
        if(i!=n-1)
            return 0;
        bool vl=VerifySquenceOfBS(l);
        bool vr=VerifySquenceOfBS(r);
        return vl&&vr;
    }
    //包含向量为空时的判断。
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return 0;
        return VerifySquenceOfBS(sequence);
    }
    
};

小知识点

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)
它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
牛客网本题设定为:空树不为二叉搜索树,故需要分函数进行运算

你可能感兴趣的:(二叉搜索树的后序遍历序列)