后序遍历:左、右、根
二叉搜索树:左子树中所有节点的值 << 根节点的值;右子树中所有节点的值 >> 根节点的值;其左、右子树也分别为二叉搜索树。
Ⅰ、递归分治
遍历找到第一个大于根节点的数,划分出左右子树,再进行所有子树判断
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
return judge(postorder,0,postorder.size()-1);
}
bool judge(vector<int> postorder, int i, int j)
{
if(i>=j)
return true;
int p = i;
while(postorder[p] < postorder[j])
p++;
int m = p; //m为第一个大于根节点的位置
while(postorder[p] > postorder[j])
p++;
return p==j && judge(postorder,0,m-1) && judge(postorder,m,j-1); //再分别判断左右子树
}
};
Ⅱ、利用单调栈
从后往前遍历
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
stack<int> stack;
int root = INT_MAX;
for(int i=postorder.size()-1; i>=0; i--)
{
if(postorder[i] > root)
return false;
while(!stack.empty() && stack.top() > postorder[i])
{
root = stack.top();
stack.pop();
}
stack.push(postorder[i]);
}
return true;
}
};