/*
每次递归划分出左右子树进行判断
根据最后一个元素根节点,划分左子树,剩下的为右子树,判断右子树是否符合条件。
然后递归判断左右子树.
边界条件:eg当left=2,sequence[left]=5,right=3,sequence[right]=5;
i=3,递归进去左子树f(sequence,3,2);
*/
class Solution {
public:
    bool f(vector<int> &sequence, int left, int right){
        if(left>=right)return true;//left>=right,当没有左子树时left>right.
        int i=left;
        for(;i<=right&&sequence[i]<sequence[right];i++);//i<=right当全部是右子树
        for(int j=i;j<right;j++)if(sequence[j]<sequence[right])return false;
        return f(sequence,left,i-1)&&f(sequence,i,right-1);
       //当循环不执行是i=left,则i-1<left,同理可能right-1<i
    }
    bool VerifySquenceOfBST(vector<int> sequence) {
       if(!sequence.size())return false;//为空直接返回
        return f(sequence,0,sequence.size()-1);//调用递归函数
    }
/*
用栈模拟,先根节点,在右子树再左子树。按照根节点,右子树的关系建立树,用左子树节点是否符合判断是否正确。
每次要走左子树时候,更新max,接下来遍历的所有节点都要小于max,否则return false
出栈时,找到当前节点最小的祖先节点,并更新max。
*/
    bool VerifySquenceOfBST2(vector<int> &s) {
        if (!s.size()) return false;
        stack<int> roots;
        roots.push(INT_MIN);
        int max = INT_MAX;
        for (int i=s.size()-1; i >= 0; i--) {//每次循环是一个递归过程,从根节点深入右子树
            if (s[i] > max) return false;//右子树中有节点值大于根节点
            while (s[i] < roots.top()) {//进入左子树,找到该节点的最大祖辈
                max = roots.top();//当走左子树的时候才更新max值,这是要遍历节点的上线。
                roots.pop();
            }
            roots.push(s[i]);//该节点成为新的根节点。
        }
        return true;
    }


};