class Solution {
public:
/* 搜索二叉树的后序遍历结果,当前根结点左儿子下标,一定是
* 最后一个小于根节点元素的下,右儿子下标,一定是大于根节点的最后一个元素下标
* 4,8,6,12,16,14,10 子结点查找范围
* 左 右 根 (left---right)
* 4,8,6,12,16,14
* 左 右 根 (0---nextl)左子树
* 4,8,6,12,16,14
* 左 右 根 (nextr----right-1)右子树
* 由此以来,不满足这种性质的nextl、nextr直接return false;
* 或者说: 只要nextl > nextr return false
* 结尾附 根据后序结果建立一个搜索二叉树
*/
bool isBST(vector<int>& seq,int left,int right){
if(left > right){ //找完了就是true
return true;
}
int nextl = -1;int nextr = right;
for(int i = left;i<=right;i++){
if(seq[i] < seq[right]){
nextl = i;
}if(seq[i] > seq[right]){
//下面这一行是找右子树的左边界,
//也可以重新遍历 找到第一个大于根节点的后直接 break;
nextr = nextr==right ? i:nextr;
}
}
if(nextl > nextr){ //上面提到的条件
return false;
}
return isBST(seq, left, nextl)&&isBST(seq, nextr, right-1);
}
bool VerifySquenceOfBST(vector<int> sequence) {
//TreeNode* head = creatTree(sequence, 0,sequence.size()-1);
if(sequence.size() <= 0){
return false;
}
return isBST(sequence, 0, sequence.size()-1);
}
//附 : 根据后序遍历结果创建搜索二叉树
TreeNode* creatTree(vector<int>& arr,int left,int right){
if (left > right){
return nullptr;
}else{
TreeNode* node = new TreeNode(arr[right]);
int nextl = -1;
int nextr = right;
for(int i = left;i<=right;i++){
if(arr[i] < node->val){
nextl = i;
}if(arr[i] > node->val){
//右子树的左边界,也可以重新遍历,找到就break;
nextr = nextr == right ? i:nextr;
}
}node->left = creatTree(arr, left, nextl);
node->right = creatTree(arr, nextr , right-1);
return node;
}
}
};