题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
首先需要知道,二叉搜索树的特点是,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。后序遍历是按照左——右——根的顺序进行遍历的。所以这道题的大体思路是,根据左子树小于根节点的特点,找到左子树的分界点,然后从右子树开始,看是不是所有的值都大于根节点,如果出现小于根节点的情况,说明不符合要求。然后对左子树 (l, k-1) 和右子树 (k, r-1) 进行递归。当 l >= r 时,说明判断完成,可以返回true。
还有要注意特判一下数组是否为空,如果为空,直接返回false。
c++代码如下:
1 class Solution { 2 public: 3 vector<int> seq; 4 bool VerifySquenceOfBST(vector<int> sequence) { 5 seq = sequence; 6 if(seq.empty()) return false; 7 return dfs(0, seq.size() - 1); 8 } 9 10 bool dfs(int l, int r){ 11 if(l >= r) return true; 12 int k = l; 13 while(k < r && seq[k] < seq[r]) k++; 14 for(int i = k; i < r; i++){ 15 if(seq[i] < seq[r]) return false; 16 } 17 return dfs(l, k-1) && dfs(k, r-1); 18 } 19 };