二叉搜索树的后序遍历序列
方法一:递归判断,将后序遍历序列的左右子树递归判断下去
因为后序遍历是:左右根节点。二叉搜索树中左节点小于根节点小于右节点。递归查找每个子树是否符合这个条件就行。
bool VerifySquenceOfBST(vector<int> sequence) {
int l = 0;
int r = sequence.size()-1;
if(l>r) //序列为空
return false;
return dfs(sequence, l, r);
}
bool dfs(vector<int>seq, int l, int r)
{
if(l >=r)
return true;
int root = seq[r];
//先找到左子树
int mid = 0;
int i = l;
for(i = l; i < r; ++i)
{
if(root < seq[i])
break;
}
mid = i-1;
//再判断右子树是否都大于根节点
for(;i<r;++i)
{
if(root > seq[i])
return false;
}
return dfs(seq, l, mid) && dfs(seq, mid+1, r-1);
}
方法二:
看来其他人的解题思路,这个方法确实很巧妙。利用二叉搜索树的根节点是左子树的上限,是右子树的下限。
一个简单的例子:1 4 3 8 5,从右遍历,结点入栈是,根节点右子树,当结点小于栈顶元素时,就出栈,将前面的右子树和根结点出栈。将上限修改为根节点的值。
最开始上限不确定是多少,就用最大值。
一开始压入栈中一个最小值,确保栈不会为空。
bool VerifySquenceOfBST(vector<int> sequence) {
stack<int> rec;
roots.push(INT_MIN);
int maxval = INT_MAX;
if(sequence.size()==0)
return false;
for(int i = sequence.size()-1; i >=0; i--)
{
if(sequence[i] > maxval)
return false;
//将右子树和根节点出栈,根节点作为上限。
while(sequence[i] < rec.top())
{
maxval = rec.top();
rec.pop();
}
rec.push(sequence[i]);
}
return true;
}