二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路:
所给序列是二叉搜索树的后续遍历,其实就可以确定树的形态了,因为比根节点大的都是右子树节点,比根节点小的都是左子树节点,但是满足一个重要性质:左子树的子节点的最大值需要比根节点小,右子树的子节点最小值需要比根节点大。需要判断祖父节点跟当前节点的大小关系。
class Solution {
public:
bool MyVerify(vector<int>seq, int p, int pp, int l, int r){
if(r < l){
return true;
}
int i;
for(i=l; i <= r; i++){
if(pp > p){
//left
//max(v) < pp
if(seq[i] > pp){
return false;
}
}else{
//right
//min(v) > pp
if(seq[i] < pp){
return false;
}
}
}
for(i=l; i <= r; i++){
if(seq[i] > p){
break;
}
}
bool lres = true;
if(i-2 >= l){
lres = MyVerify(seq, seq[i-1], p, l, i-2);
}
bool rres = true;
if(r-1 >= i){
rres = MyVerify(seq, seq[r], p, i, r-1);
}
if(lres && rres){
return true;
}else{
return false;
}
}
bool VerifySquenceOfBST(vector<int> sequence) {
int l = 0;
int n = sequence.size();
for(int i=0; i < n-1; i++){
if(sequence[i] > sequence[n-1]){
l = i;
break;
}
}
bool lres = true;
if(l-1 >= 0){
lres = MyVerify(sequence, sequence[l-1], sequence[n-1], 0, l-2);
}
bool rres = true;
if(l <= n-2){
rres = MyVerify(sequence, sequence[n-2], sequence[n-1], l, n-3);
}
if (lres && rres){
return true;
}else{
return false;
}
}
};
学学学 练练练 刷刷刷

浙公网安备 33010602011771号