验证的方法很简单,由于序列是后序遍历形成,所以序列中的最后一位是根节点,而序列又是二叉搜索树,所以可以根据大于它和小于它将序列分为左右两个子序列。如果验证合理,那么右边子序列的大小一定都是大于根节点的,所以一旦出现反例,就说明验证失败。而它的两个子序列就可以使用递归的方式进行逐一验证,直到序列不可再分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { private: vector<int>* sequence; public: bool VerifySquenceOfBST(vector<int> sequence) { int seqSize=(int)(sequence.size()); if(seqSize==0) return false; this->sequence=&sequence; return doVerify(0,seqSize-1); } bool doVerify(int left,int right){ if(left>=right) return true; int middle=(*sequence)[right]; int split=left; while(split<right){ if((*sequence)[split]>middle) break; split++; } for(int i=split;i<right;i++){ if((*sequence)[i]<middle) return false; } return doVerify(left,split-1) && doVerify(split,right-1); } };
|