23.二叉树的后序遍历序列——剑指offer
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
1 //递归
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(size == 0) return false;
return isLastOrder(sequence, 0, size - 1);
}
bool isLastOrder(vector<int> &sequence, int start, int end){
if(start >= end) return true;
int mid = start;
while(sequence[mid++] < sequence[end] && mid < end);
int tmp = mid;
while(sequence[tmp++] > sequence[end] && tmp < end);
if(tmp < end) return false;
return (isLastOrder(sequence,start,mid - 1) && isLastOrder(sequence,mid,end - 1));
}
};
42 43 //非递归 44 //非递归也是一个基于递归的思想: 45 //左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的 46 //最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看有子树是否符合条件 47 //即可,即使到达了左子树左子树也可以看出由左右子树组成的树还想右子树那样处理 48 49 //对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树 50 //只需看看右子树的右子树是否符合要求即可 51 class Solution { 52 public: 53 bool VerifySquenceOfBST(vector<int> sequence) { 54 int size = sequence.size(); 55 if(0==size)return false; 56 57 int i = 0; 58 while(--size) 59 { 60 while(sequence[i++]<sequence[size]); 61 while(sequence[i++]>sequence[size]); 62 63 if(i<size)return false; 64 i=0; 65 } 66 return true; 67 } 68 };