思路:
简而言之,将二叉搜索树的后序序列倒过来,就是相应的树左右翻转过来后的新树的中序序列,对这个中序序列进行递归或非递归遍历,非递归方法中设立节点栈和最大数,每一次遍历的新节点的值都不能超过这个最大数,否则就不是二叉搜索树。
代码:
class Solution {
public:
int max_n=2147483647;
bool VerifySquenceOfBST(vector<int> sequence) {
int last_max=max_n;
int s=sequence.size();
vector<int> node_stack;
if(s==0)
return false;
if(s<=2)
return true;
node_stack.push_back(sequence[s-1]);
for(int i=s-2;i>=0;i--)
{
int n=sequence[i];
if(n>node_stack.back())
{
if(n>last_max)
return false;
node_stack.push_back(n);
continue;
}
last_max=node_stack.back();
for(int j=node_stack.size()-2;j>=0;j--)
{
if(n<node_stack[j])
node_stack.pop_back();
else
break;
}
last_max=last_max<node_stack.back()?last_max:node_stack.back();
node_stack.push_back(n);
}
return true;
}
};
总的时间耗费为外层循环和内层循环的和,外层循环一共遍历n个节点,内层循环也一共入栈和检索判断出栈O(n)次,总共的时间耗费为O(n)。