题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
例如5 7 6 9 11 10 8是二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
的后序遍历序列
而 7 4 5 6则不是,因为以6位根节点,7 4 5是右子树,但是出现了4<5,所以不是后序遍历序列
常规思路:判断右子树中是都有小于根节点的,用递归的方法再判断划分的左右子树
代码:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
bool re=1;
if(sequence.size()==0)
return 0;
recurBST(sequence,0,sequence.size()-1,re);
return re;
}
void recurBST(vector<int> sequence,int start,int end,bool& re){
if(start==end)
return;
int i=0;
while(i<end&&sequence[i]<sequence[end])
i++;
//如果有右子树,判断,不满足则递归遍历
if(i<end){
for(int j=i+1;j<=end-1;j++){
if(sequence[j]<sequence[end]){
re=0;
return;
}
}
recurBST(sequence,i,end-1,re);
}
if(i!=start)//如果有左子树,遍历
recurBST(sequence,start,i-1,re);
}
};
另外用非递归的方法也可以,代码非常简洁,从右边开始,分别将每个结点作为根节点,再遍历前面的元素
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size=sequence.size();
if(0==size)
return 0;
int i=0;
while(--size){
while(sequence[i]<sequence[size]) i++;
while(sequence[i]>sequence[size]) i++;
if(i<size)
return 0;
i=0;
}
return 1;
}
};