【剑指offer】二叉搜索树的后序遍历序列 python+c++

176 阅读1分钟

【题目描述】

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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.