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

89 阅读1分钟

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

思路

  1. 二叉搜索树后序遍历的规律:
  2. 序列[左集..., 右集..., 根],其中左集一定小于根,右集一定大于根。
  3. 不停地根据这个范围找到 左集、右集 范围,再根据范围继续递归。
class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        int n = postorder.size();
        return dfs(postorder, 0, n - 1);
    }
private:
    bool dfs(vector<int> &v, int l, int r) {
        if(l >= r) return true;
        int p = l;
        // 左集一定小于根
        while(v[p] < v[r]) p++;
        // 获得分割点
        int m = p;
        // 右集一定大于根
        while(v[m] > v[r]) m++;
        // 如果没成功遍历到末尾,则失败
        if(m != r) {
            return false;
        }
        //往左右集搜索
        return dfs(v, l, m - 1) && dfs(v, m, r - 1);
    }
};
​