二叉搜索树的后序遍历序列
输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出YES,不是则输出NO。假设输入的数组任意两个字符都不相同。
题解:
对于此题,我们首先要了解的是二叉搜索树的结构,即什么是二叉搜索树。同时,了解后序遍历的遍历顺序。
二叉搜索树(二叉查找树、二叉排序树):其或为一个空树,或是具有以下性质的二叉树——若它的左子树不空,则左子树上的所有节点的值均小于根节点的值;若它的右子树不空,则右子树上的所有节点的值均大于根节点的值。同时,其左右子树也是二叉搜索树。
后序遍历:遍历顺序为 左节点->右节点->根节点
因此可以得到,二叉搜索树的后序遍历的特点:后序遍历的最后一个数即为二叉搜索树的根节点;小于根节点的值的节点位于左子树,大于根节点的值的节点位于右子树。
从根节点到叶节点通过递归的方法来进行测试,若满足条件,则该序列为某二叉搜索树的后序遍历,若不满足,则不是。
注意虽然在题目中说明数组非空,但是在测试过程中,还是出现了空数组。
代码如下:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence,int status=0) {
int num=sequence.size();
int le=0,ri=0;
if(status==0&&num==0)//status用于判定第一次输入的数组是否是空数组
return false;
if(num==0||num==1)//判定只有一个数的数组,满足条件
return true;
while(sequence[ri]<sequence[num-1])//获得左右子树的分界点
ri++;
vector<int> left;
vector<int> right;
for(int i=0;i<num-1;i++){
if(i<ri){
if(sequence[i]<sequence[num-1])//在分界点左侧的数据均小于根节点,若不是,则代表序列不是二叉搜索树的后序遍历
left.push_back(sequence[i]);
else
return false;
}
else{//根节点右侧的数据均大于根节点,若不是,则直接返回false
if(sequence[i]>sequence[num-1])
right.push_back(sequence[i]);
else
return false;
}
}
//递归进行根节点的左右子树,递归判定。只有全部满足,才会返回true
return VerifySquenceOfBST(left,1)&&VerifySquenceOfBST(right,1);
}
};