- 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 思路:
- 既然是二叉搜索树,那么排好序的数组就是这棵树的中序遍历序列
- 使用中序遍历序列和后序遍历序列即可构造这棵树
- 如果构造失败,那这个序列就不是某一颗二叉搜索树的后序遍历序列
- 启发或者坑:
- 构造树的过程中,递归构造,明确递归函数的递归集格外重要
- 代码
class Solution { public: vector<int> midS; vector<int> postS; bool VerifySquenceOfBST(vector<int> sequence) { //需要特判输入的序列是不是为空 if (sequence.size() == 0) return false; for (int i = 0; i < sequence.size();i++) { midS.push_back(sequence[i]); postS.push_back(sequence[i]); } sort(midS.begin(), midS.end()); return modifyIsTree(0, sequence.size()-1, 0, sequence.size()-1); } bool modifyIsTree(int m1, int m2, int p1, int p2) { //理论上划分的左子树和右子树大小是一致的,如果有出现m1>m2的情况,那就是已经验证到空节点了,说明一路顺畅,之前的整颗树都验证完了 if (m1 > m2 || p1 > p2) { return true; } int root_value = postS[p2]; for (int i = m1; i <= m2; i++) { if (midS[i] == root_value) { return modifyIsTree(m1, i-1, p1, p1+(i-1-m1)) && modifyIsTree(i+1, m2,p1+(i-m1), p2-1); } } return false; } };