leetcode 剑指offer 33 二叉搜索树的后序遍历序列
思路
- 二叉搜索树后序遍历的规律:
- 序列[左集..., 右集..., 根],其中左集一定小于根,右集一定大于根。
- 不停地根据这个范围找到 左集、右集 范围,再根据范围继续递归。
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);
}
};