题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树。
后序遍历的顺序是左-右-根,因此序列可分为三部分:左子树、右子树、根;
由以上性质可知,左子树序列所有值均小于根,右子树所有值均大于根,因此可以先找到左右子树的分界点,序列中第一个大于根的点就是分界点。
分界点之前的点都小于根,不需再次判断;
只需判断分界点之后的点是否都不小于根,若不满足,则返回false;若满足,则继续递归判断左子树和右子树。
代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int m=sequence.size();
if(m<=0)
return false;
else
return _VerifySquenceOfBST(sequence);
}
bool _VerifySquenceOfBST(vector<int> sequence){
int m=sequence.size();
if(m<=0)
return true;
int split=0;
int rootval=sequence.back();
for(int i=0;i<m;i++){
if(sequence[i]>=rootval){
split=i;
break;
}
}
for(int i=split+1;i<m-1;i++){
if(sequence[i]<rootval)
return false;
}
vector<int> seqleft(sequence.begin(),sequence.begin()+split);
vector<int> seqright(sequence.begin()+split,sequence.end()-1);
return _VerifySquenceOfBST(seqleft)&&_VerifySquenceOfBST(seqright);
}
};