题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
代码
class Solution {
public:
// 根据根节点划分左右子树,递归判断
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
// 中序遍历最后一个元素是根结点
int root = sequence.back();
int len = sequence.size();
bool isTrue = true;
int i = 0;
// 左子树序列::比根节点小的元素
while(i<len && sequence[i]<root)
i++;
vector<int> leftSeq(sequence.begin(), sequence.begin() + i);
bool left = leftSeq.empty()?true:VerifySquenceOfBST(leftSeq);
// 右子树序列:比根节点大的元素
int index = i;
while(i<len && sequence[i] > root)
i++;
if (i < len-1) // 如果有元素比根节点小的说明错误
return false;
vector<int> rightSeq(sequence.begin()+index, sequence.end() -1);
bool right = rightSeq.empty()?true:VerifySquenceOfBST(rightSeq);
isTrue = left && right;
return isTrue;
}
};
// /* 求中序遍历,再根据压栈弹栈序列是否匹配判断;复杂 */
//class Solution {
//public:
// bool VerifySquenceOfBST(vector<int> sequence) {
// if(sequence.empty())
// return false;
// vector<int> inOrder = sequence;
// sort(inOrder.begin(), inOrder.end()); // 中序遍历就是排好序的数组
//
// // 中序遍历序列为压栈;后序遍历为弹出序列
// // 需满足压栈弹出关系才可以
// int len = sequence.size();
// int inIndex = 0;
// int posIndex = 0;
// stack<int> s;
// while(posIndex < len){
// // 当s为空或者pop序列当前元素不为栈顶
// while(s.empty() || sequence[posIndex]!= s.top()){
// s.push(inOrder[inIndex++]);
// if (inIndex>len)
// break;
// }
// if (sequence[posIndex]!= s.top())
// break;
// s.pop();
// posIndex ++;
// }
//
// if(s.empty() && posIndex == len)
// return true;
// else
// return false;
// }
//};