题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
二叉搜索树的特点:后序遍历的时候最后一个数是根节点。前面的数分为两个部分,本别是左子树部分和右子树部分。左子树不部分的所有数都比根节点小;右子树部分的所有数都比根节点大。
因此可以这样判定:
如果该二叉树空树,则返回false;
如果不为空,那么确定根节点为最后一个数。
以该数值为分界,将数组分成两个部分,前半部分为左子树,后半部分为右子树。(左右子树都可能为空)
只有当左右子树都为二叉搜索树的时候,该树才为二叉搜索树。所以接下来判断左右子树。
左子树一定为空或者是全都是小于根节点的数,不用逐个比较左子树中的数值和根节点的数值,直接继续判断左子树是否为二叉搜索树。(递归)。
首先逐个判断右子树中所有数值是否都大于根节点值,如果不是,则右子树不是二叉搜索树;如果是,则继续判断右子树是否是二叉搜索树(递归)。
最后 当左子树和右子树都是二叉搜索树的时候,才能够说明该树是二叉搜索树。
代码实现
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()){return false;}
int len=sequence.size();
int root=sequence[len-1];
int idx=0;
vector<int> leftTree;
vector<int> rightTree;
bool left=true;
bool right=true;
while(idx<len-1&&sequence[idx]<root){
idx++;
}
if(idx!=0)//左子树不为空,则接着判断是左子树是否是BST
{
//leftTree(sequence,sequence+idx);
leftTree.insert(leftTree.begin(),sequence.begin(),sequence.begin()+idx);
left=VerifySquenceOfBST(leftTree);
}
if(idx!=len-1){//因为在len-1位置上的元素是根元素
for(int j=idx;j<len-1;j++){
if(sequence[j]<root){
right=false;
break;
}
}
if(right){
rightTree.insert(rightTree.begin(),sequence.begin()+idx,sequence.begin()+len-1);
right=VerifySquenceOfBST(rightTree);
}
}
return left&&right;
}
};