剑指offer:二叉搜索树的后序遍历序列

来源:互联网 发布:mac matlab mex用法 编辑:程序博客网 时间:2024/05/16 11:46


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

class Solution {public:    bool Verify(vector<int> seq)        {        int len = seq.size();         if(!len || len == 1 || len == 2)            return true;        else if(len == 3)            {            if(seq[0] > seq[2] && seq[1] > seq[0])                return false;            else if(seq[0] > seq[2] && seq[1] < seq[2])                return false;            else                return true;        }        vector<int> left;//存放左子树        vector<int> right;//存放右子树        int num = seq[len - 1];//根节点        int i, j;        for(i = 0; i < len - 1; i++)            {            if(seq[i] > num)                break;//找到根节点所在位置,以此为界限划分左右子树,分别存放到left和right中进行递归        }        if(i == 0)            {            right = seq;            right.pop_back();//数字序列全部大于根节点,说明只有右子树,注意要把根节点弹出        }        else if(i == len - 1)            {            left = seq;            left.pop_back();//数字序列全部小于根节点,说明只有左子树,注意要把根节点弹出        }        else            {            for(j = 0; j < len - 1; j++)                {                if(j < i)                    left.push_back(seq[j]);//划分左右子树,此时左子树肯定全小于根节点,右子树不一定                else                    right.push_back(seq[j]);            }        }        for(i = 0; i < right.size(); i++)            {            if(num > right[i])                return false;//右子树中有大于根节点的直接返回false        }        return Verify(left) && Verify(right);    }        bool VerifySquenceOfBST(vector<int> sequence) {        int len = sequence.size();        if(!len)            return false;        else            return Verify(sequence);    }};

0 0