class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.empty()) return false; return find(sequence); } bool find(vector<int> sequence) { if (sequence.empty()) return true; int back = sequence.back(); auto pin = sequence.begin(); while(pin != sequence.end()){ if (*pin < back) ++pin; else break; } // 此时的pin指向第一个大于back的值或者end指针 vector<int> seq1(sequence.begin(), pin); auto pin1 = pin; // 检查右子树是否合规,这里面有back值 while (pin != sequence.end()){ if (*pin >= back) ++pin; else return false; } // 检查完后构造第二个seq vector<int> seq2(pin1, sequence.end()-1); return find(seq1) && find(seq2); } };
题干:判断一个序列是否是二叉搜索树的后序遍历,且该序列的值均不相同
参考别人的思想,若问题为true,则序列最后元素为树节点,根据其可以将序列分为左子树和右子树两部分。find函数是递归部分
1、首先根据back值分出左子树部分,接着检查右子树部分是否满足都大于back,满足条件则开始下一轮递归
2、这里要注意起初空序列返回为false,但之后若左子树或右子树为空要返回true,所以单独写了递归函数