题目来源:二叉搜索树的后序遍历序列_牛客题霸_牛客网 (nowcoder.com)
描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。
数据范围: 节点数量 0 \le n \le 10000≤n≤1000 ,节点上的值满足 1 \le val \le 10^{5}1≤val≤105 ,保证节点上的值各不相同
要求:空间复杂度 O(n)O(n) ,时间时间复杂度 O(n^2)O(n2)
提示:
1.二叉搜索树是指父亲节点大于左孩子节点,但是小于右孩子节点。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
4.参考下面的二叉搜索树,示例 1
输入:[1,3,2]
返回值:true
说明:是上图的后序遍历 ,返回true
我的代码:
采用递归的方法,利用后续遍历的性质,最后一个为当前的根节点cur,剩下的序列中,左边的值全部小于cur,右边的值全部大于cur。
class Solution {
public:
bool VerifySequence(vector<int> sequence, int left, int right){
if(left>right)//没有元素
return true;
int cur=sequence[right];//当前的根节点
int i=right-1;
while(i>=left && sequence[i]>cur) i--;
for(int j=left; j<=i;j++){
if(sequence[j]>cur) return false;
}
return VerifySequence(sequence,left,i) && VerifySequence(sequence,i+1,right-1);
}
bool VerifySquenceOfBST(vector<int> sequence) {
int r=sequence.size();
if(r==0)
return false;//空树不是二叉搜索树
return VerifySequence(sequence,0,r);
}
};