【剑指Offer-举例让抽象问题具体化】面试题33:二叉树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路

二叉排序树:左子树的节点值均小于根结点,右子树的节点值均大于根结点;或者是一棵空树。二叉排序树的后序遍历序列的最后一个值为根结点的值,根据根结点可以将序列分为两部分,一部分小于根结点的值,对应左子树,另一部分大于根结点的值,对应右子树。对于左右子树使用同样的方法递归判断即可。如果不能将整个序列分成这样的两个子序列,则该序列不是平衡二叉树的后序遍历结果。对应代码如下:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return false;
        
        int sep = 0;    //左右子树的分割点
        int root = sequence[sequence.size()-1];
        while(sequence[sep]<root && sep<sequence.size()-1)     //注意终止条件是sep<sequence.size()-1
            sep++;
        
        for(int i=sep; i<sequence.size()-1; i++)    //注意终止条件是sep<sequence.size()-1
            if(sequence[i]<root)
                return false;
        
        bool left=true;
        if(sep>0){
            vector<int> leftSequence;
            for(int i=0; i<sep; i++)
                leftSequence.push_back(sequence[i]);
            left = VerifySquenceOfBST(leftSequence);
        }
        
        bool right=true;
        if(sep<sequence.size()-1){
            vector<int> rightSequence;
            for(int i=sep; i<sequence.size()-1; i++)     //注意终止条件是sep<sequence.size()-1
                rightSequence.push_back(sequence[i]);
            right = VerifySquenceOfBST(rightSequence);
        }
        
        return left&&right;
    }
};
posted @ 2020-03-12 10:54  Flix  阅读(116)  评论(0编辑  收藏  举报