题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉搜索树,中序遍历的最后一个元素是中间值,找到前一半比它小的,后一半比他大。
如果不满足一半小一半大,就false
满足就递归左右部分
class Solution { public: bool judge(vector<int>& a, int l, int r){ if(l >= r) return true; int i = r; while(i > l && a[i - 1] > a[r]) --i;//到达分界点的比头大的元素 for(int j = i - 1; j >= l; --j) if(a[j] > a[r]) return false; return judge(a, l, i - 1) && (judge(a, i, r - 1)); } bool VerifySquenceOfBST(vector<int> sequence) { if(!sequence.size()) return false; return judge(sequence, 0, sequence.size() - 1); /* CLion能过 但是 这上面过不了 //return false; if(sequence.empty())return false; int len = sequence.size(); if(len<=2)return true; int tou = sequence[len-1]; // 此时二叉树的头 int flag = 0; //在某个位置前面 都应该比tou小 后面的都比头大 int flag_i ; for(int i=0 ; i<len-1 ; ++i){ if(sequence[i]<tou)flag_i=i;//会到最后一个比tou小的地方 if(sequence[i]>tou)flag=1;//只要出现了比头大的 后面就应该都要大 if(flag == 1 && sequence[i]<tou)return false;//后面出现比头小的了 } vector<int> sequence_front , sequence_back; for(int i=0 ; i <=flag_i ; ++i)sequence_front.push_back(sequence[i]); for(int i=flag_i+1 ; i <len-1 ; ++i)sequence_back.push_back(sequence[i]); return VerifySquenceOfBST(sequence_front) && VerifySquenceOfBST(sequence_back); */ } };