【问题】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
【思路】注意题目给出的是二叉搜索树,那么它就有一个很重要的性质:左孩子值<=根的值<=右孩子的值!但题目中说明了任意两个数字都互不相同,说明没有重复数字。
由于给出的是后序遍历,我们就可以知道最后一个数为根节点,并且其左子树的值均小于根节点的值,右子树的值均大于根节点的值。因此我们可以从头遍历,直到找到第一个大于根节点的值,我们就可以得到左右子树划分的边界,其后面所有值都应该大于根节点的值,最后利用分治思想进行递归即可!
class Solution { public: bool process(vector<int> seq, int start, int end){ if(seq.size() == 0) return false; int i; // 左子树的索引 if (start >= end){ return true; } for(i = 0;i < end; i++){ if(seq[i] > seq[end]){ break; } } for(int j = i;j < end; j++){ // j 为右子树的索引 if(seq[j] < seq[end]){ return false; } } return process(seq, start, i-1) && process(seq, i, end-1); } bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) return false; if (sequence.size() == 1) return true; return process(sequence, 0, sequence.size()); } };