问题描述:
输入一个整数数组,判断它是否为某二叉搜索树的后序遍历,如果是输出YES,否则输出NO,假设数组内任意两个数都不相等
还是先从概念入手:
二叉搜索树:
它可能是一颗空树
若不是空树,则满足:
1.若左子树不为空,则左子树上所有结点的值均小于根结点的值
2.若右子树不为空,则右子树上所有结点的值均大于根结点的值
3.左、右子树也分别是二叉搜索树
一颗树的后序遍历是以 根结点--->左结点----->右结点的顺序遍历的,那么我们可以得出数组的最后一个元素一定是这棵树的根结点
再因为二叉搜索树的左子树的结点的值一定小于根结点的值,右子树的结点的值一定大于根结点的值,所以数组中小于最后一个元素的一定是该树的左子树上的结点,大于最后一个元素的一定是该树右子树上的结点,而且一定是数组的前半部分小于根结点的值,后半部分大于根结点的值,我们只需找出这三种值(根结点的值、小于根结点的值、大于根结点的值)即可
继续根据概念下手,二叉搜索树的左右子树都是一棵二叉搜索树,所以再重复上面的思路
具体思路:
1.从数组中找到根结点 a[n-1];
2.从数组中第一个元素找到第一个大于根结点的元素 a[i];
3.从a[i] 到 a[n-2] 如果有大于a[n-1],则false,没有,continue
4.如果i>0,说明这棵树有左子树,判断a[0,1,...,i-1],重复1.2.3的步骤
5.如果i<n-1,则说明这棵树有右子树,判断a[i,i+1,....n-2],重复1.2.3的步骤
6.如果 4 == true && 5 == true,return true 否则 return false
代码:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
int len = sequence.size();
vector<int>left;
vector<int>right;
int i = 0;
for(;i<len-1;i++){
if(sequence[i]<sequence[len-1])
left.push_back(sequence[i]);
else
break;
}
for(;i<len-1;i++){
if(sequence[i]>sequence[len-1]){
right.push_back(sequence[i]);
}else{
return false;
}
}
bool left1=true,right1=true;
if(!left.empty())
left1 = VerifySquenceOfBST(left);
if(!right.empty())
right1 = VerifySquenceOfBST(right);
return left1&&right1;
}