【剑指offer】【树】33.二叉搜索树的后续遍历序列

题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/

递归

直接用二叉搜索树的后序遍历构建二叉树(利用二叉搜索树的性质,根节点的左子树都比他小,右子树都比他大),如果构建成功,返回true;否则,返回false;
后续遍历:左右根;
时间复杂度:O(n)
空间复杂度:O(n)

class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        return dfs(postorder, 0, postorder.size() - 1);  
    }
    bool dfs(vector<int>& v, int l, int r)
    {
        if(l >= r) return true;
        //根节点
        int k = l;
        //从左开始找,找到最后一个比根节点小的数,根节点的左子树
        int root = v[r];
        while(k < r && v[k] < root) k++;
        //判断右子树的所有点是不是每个点都比根节点大
        for(int i = k; i < r; i++)
            if(v[i] < root) return false;
        //递归处理左右两边
        return dfs(v, l, k - 1) && dfs(v, k, r - 1);
    }
};
posted @ 2020-05-06 20:36  NaughtyCoder  阅读(117)  评论(0)    收藏  举报