剑指offer-刷题笔记-中难题-JZ33 二叉搜索树的后序遍历序列
版本1-本来打算用递归的方法,没有完整的写出来
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() == 0)
{
return false;
}else{
int root = sequence[sequence.size()-1];
int leftRoot;
int rightRoot;
bool flagRight = false;
bool flagLeft = false;
for(int j = sequence.size()-2;j >= 0;j--)
{
if(sequence[j] > root && flagRight == false)
{
rightRoot = sequence[j];
flagRight = true;
}
if(sequence[j] < root && flagLeft == false)
{
leftRoot = sequence[j];
flagLeft = true;
}
}
}
return false;
}
};
版本2-递归
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() == 0) return false;
return order(sequence, 0, sequence.size() - 1);
}
bool order(vector<int>& sequence, int l, int r) {
if(l >= r) return true;
int j;
int mid = sequence[r];
for(j = r; j >= l; j--) {
int cur = sequence[j];
if(cur < mid) break;
}
for(int i = j; i >= l; i--) {
int cur = sequence[i];
if(cur > mid) return false;
}
return order(sequence, l, j) && order(sequence, j+1, r-1);
}
};
版本3-辅助栈
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() == 0)
{
return false;
}
int root = INT_MAX;
stack<int> s;
for(int j = sequence.size()-1;j>=0;j--)
{
if(sequence[j] > root) return false;
while( !s.empty() && sequence[j] < s.top())
{
root = s.top();
s.pop();
}
s.push(sequence[j]);
}
return true;
}
};