剑指 Offer 33. 二叉搜索树的后序遍历序列

根据二叉搜索树的定义,可以通过递归,判断所有子树的正确性 (即其后序遍历是否满足二叉搜索树的定义) ,若所有子树都正确,则此序列为二叉搜索树的后序遍历。

终止条件: 当 \(l \geq r\) ,说明此子树节点数量小于等于\(1\),返回 true ;

划分左右子树: 遍历后序遍历的 \([l, r]\) 区间元素,寻找第一个大于根节点值的节点,索引记为 \(k\) 。此时,可划分出左子树区间 \([l,k-1]\)、右子树区间 \([k, r - 1]\)

判断是否为二叉搜索树:
左子树区间 \([l, k-1]\) 内的所有节点都应小于根节点的值。
右子树区间 \([k, r-1]\) 内的所有节点都应大于根节点的值。

class Solution {
public:
    vector<int> post;
    bool verifyPostorder(vector<int>& postorder) {
        post = postorder;
        if (post.empty()) return true;
        return isPostorder(0, post.size() - 1);
    }

    bool isPostorder(int l, int r) {
        if (l >= r) return true;
        
        int root = post[r];
        int k = l;
        while (k < r && post[k] < root) k++;
        
        for (int i = k; i < r; i++) {
            if (post[i] < root)
                return false;
        }
        
        return isPostorder(l, k - 1) && isPostorder(k, r - 1);
    }
};
posted @ 2021-07-25 22:07  Dazzling!  阅读(18)  评论(0编辑  收藏  举报