面试题33. 二叉搜索树的后序遍历序列

152 阅读1分钟

题目

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

思路

对于一个后序序列来说,最后一个元素就是根节点,根节点的左子树节点值都小于根节点,并且小于右子树的节点值,因为是BST,这样,遍历序列,找到第一个大于根节点值的位置,那么此后的所有值一定也必须大于根节点的值,否则就false,再递归就可以了

代码


class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        if(postorder.size()<=1)
            return true;
        return f(postorder,0,postorder.size()-1);
    }
    bool f(vector<int>v,int L,int R){
        if(L>R)
            return true;
        int root=v[R];
        int k;
        for(k=L;k<=R;k++)
            if(v[k]>=root)
                break;
        for(int i=k;i<R;i++)
            if(v[i]<root)
                return false;
        bool left=true,right=true;
        left=f(v,L,k-1);
        right=f(v,k,R-1);
        return left&&right;
    }
};

题目链接