题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
递归
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int size=sequence.size(); if(0==size) { return false; } return isLastOrder(sequence,0,size-1); } private: bool isLastOrder(vector<int>& sequence,int b,int e) { if(b==e) { return true; } int mid=b; while(sequence[mid++]<sequence[e] && mid<e); int tmp=mid; while(sequence[tmp++]>sequence[e] && tmp<e); if(tmp<e) { return false; } if(mid==b || mid==e) { return isLastOrder(sequence,b,e-1); } else { return (isLastOrder(sequence,b,mid-1)&&isLastOrder(sequence,mid,e-1)); } } };
递归简化版本
BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。
class Solution { bool judge(vector<int>& a, int l, int r){ if(l >= r) return true; int i = r; while(i > l && a[i - 1] > a[r]) --i; for(int j = i - 1; j >= l; --j) if(a[j] > a[r]) return false; return judge(a, l, i - 1) && (judge(a, i, r - 1)); } public: bool VerifySquenceOfBST(vector<int> a) { if(!a.size()) return false; return judge(a, 0, a.size() - 1); } };
//非递归 //非递归也是一个基于递归的思想: //左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的 //最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看有子树是否符合条件 //即可,即使到达了左子树左子树也可以看出由左右子树组成的树还想右子树那样处理 //对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树 //只需看看右子树的右子树是否符合要求即可 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int size = sequence.size(); if(0==size)return false; int i = 0; while(--size) { while(sequence[i++]<sequence[size]); while(sequence[i++]>sequence[size]); if(i<size)return false; i=0; } return true; } };