https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/submissions/
思路:假设某棵二叉搜索树的根节点的值为 v v v,由二叉搜索树的性质易得:左子树的任意一个节点的值均小于 v v v,右子树的任意一个节点的值均大于 v v v,已知当前二叉搜索树的后序遍历为 p o s t o r d e r [ i … j ] postorder[i…j] postorder[i…j],那么显然此时根节点就是 p o s t o r d e r [ j ] postorder[j] postorder[j],通过上述性质我们可以得到一个分界点 d i v div div满足 p o s t o r d e r [ i … d i v − 1 ] < v , p o s t o r d e r [ d i v … j − 1 ] > v postorder[i…div-1]<v,postorder[div…j-1]>v postorder[i…div−1]<v,postorder[div…j−1]>v,所以左子树的区间限定到 [ i , d i v − 1 ] [i,div-1] [i,div−1],右子树的区间限定到 [ d i v , j − 1 ] [div,j-1] [div,j−1],那么不难写出递归的解法。
class Solution {
public:
bool dfs(int i,int j,vector<int>& postorder)
{
if(i>=j)
return 1;
int pos=i; //左子树理应均小于根节点的值
while(postorder[pos]<postorder[j])//找到第一个值大于根节点的位置
++pos;
int div=pos;//记录一下划分位置
while(postorder[pos]>postorder[j])//右子树理应均大于根节点的值
++pos;
if(pos==j&&dfs(i,div-1,postorder))//左子树满足题意
return dfs(div,j-1,postorder);//右子树
return 0;
}
bool verifyPostorder(vector<int>& postorder) {
return dfs(0,postorder.size()-1,postorder);
}
};