【题目描述】
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
【思路】
递归解决;二叉搜索树的左子树均小于根节点;右子树均大于根节点;
给定的序列,最后一位是根节点,然后遍历序列,找到左右子树分界处,对左右子树分别递归调用函数体。
递归终止条件是,当输入序列长度等于0,返回否。
【代码】
C++:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int length=sequence.size();
if(length==0){
return false;
}
int root=sequence[length-1];
int i=0;
for(;i<length-1;i++){
if(sequence[i]>root){
break;
}
}
int j=i;
for(;j<length-1;j++){
if(sequence[j]<root){
return false;
}
}
bool left=true;
bool right=true;
vector<int> input;
if(i>0){
for(int k=0;k<i;k++){
input.push_back(sequence[k]);
}
left=VerifySquenceOfBST(input);
}
if(i<length-1){
for(int k=i;k<length-1;k++){
input.push_back(sequence[k]);
}
right=VerifySquenceOfBST(input);
}
return left&&right;
}
};
python:
class Solution:
def VerifySquenceOfBST(self, sequence):
if not sequence or len(sequence)==0:
return False
root=sequence[-1]
i=0
while(i<len(sequence)-1):
if(sequence[i]>root):
break
i+=1
j=i
while(j<len(sequence)-1):
if(sequence[j]<root):
return False#如果有半部分中有小于根节点的,说明不可能二叉搜索树
j+=1
left,right=True,True#当左右序列为空时,返回真;但是初始序列为空,需要返回否;因此需要在这里限制进入递归的条件。
if i>0:
left=self.VerifySquenceOfBST(sequence[0:i])
if i<len(sequence)-1:
right=self.VerifySquenceOfBST(sequence[i:-1])
return left and right
递归法的时间复杂度是O(nlogn);递归深度为logn,每次递归的时间复杂度为n.