题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
递归
注意,主要就是假定数组为空时结果为false,因为导致的递归之前需要判断左右子树是否为空,注意判断是否为空的条件。
代码:
如果假定数组为空时,结果为true,则如下代码应该可以 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()<=0) return true; int length=sequence.size(); int root=sequence[length-1]; int i=0; while(sequence[i]<root) i++; int j=i; for(;j<sequence.size()-1;++j) if(sequence[j]<root) return false; vector<int> seq1(sequence.begin(),sequence.begin()+i); vector<int> seq2(sequence.begin()+i,sequence.begin()+j); return VerifySquenceOfBST(seq1) && VerifySquenceOfBST(seq2); } };
OJ和书都假定数组为空时,结果为false,代码修改如下:
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()<=0) return false;//好吧,OJ说这个是false int length=sequence.size(); int root=sequence[length-1]; int i=0; while(sequence[i]<root) i++; int j=i; for(;j<sequence.size()-1;++j) if(sequence[j]<root) return false; vector<int> seq1(sequence.begin(),sequence.begin()+i); vector<int> seq2(sequence.begin()+i,sequence.begin()+j); bool flag=true; if(i>0)//因为序列为空时,OJ假定为false了,而子树是可以为空的;所以递归之前需要判断序列是否为空 flag=VerifySquenceOfBST(seq1); if(flag==true && i<sequence.size()-1)//注意这里判断右子树非空的条件,也是根据i flag=VerifySquenceOfBST(seq2); return flag; } };