23. 二叉搜索树的后序遍历序列

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


/*二叉搜索树又叫二叉查找树,二叉排序树,
如果左子树不为空,那么左子树上所有结点的值均小于等于根结点的值;
如果右子树不为空,那么右子树上所有结点的值均大于等于根结点的值;
左右子树也都是二叉排序树。*/


/*思路:
二叉搜索树的后序遍历结果:左子树,右子树,根结点。题目中的值没有
重复的。最后一个值肯定是根结点,我们可以将根结点前面的值分为两组,
第一组值小于根结点,属于左子树,第二组值大于根结点,属于右子树。
例如:1,3,2,5,7,6,4,那么4为根节点,前面的1小于4,那么存在左子树,
前面的1,3,2属于左子树,5大于4,那么存在右子树,5,7,6属于右子树;
再看1,3,2,2跟左子树的根节点,1小于2,为左子树,3大于2,为右子树,
以此类推。
再看7,4,6,5:5为根结点,7大于5,所以不存在左子树,但是右子树中有
个4,4小于5,所以这个数组不是一个二叉搜索树的后序遍历序列。
*/
class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int len = sequence.size();
        return judge(sequence, len);
    }
private:
    bool judge(vector<int> sequence, int len){
        if(len == 0)
            return false;
        if(len == 1)
            return true;
        int root = sequence[len - 1];
		//左子树
        int i = 0;
        for(; i < len - 1; i ++){
            if(sequence[i] > root)
                break;
        }
		//右子树
        int j = i;
        vector<int> value;
        value.clear();
        for(; j < len - 1; j ++){
            if(sequence[j] < root)
                return false;
            value.push_back(sequence[j]);
        }
		// 递归,分别判断左子树和右子树是否符合二叉搜索树
        bool left = true;
        if(i > 0)
            left = judge(sequence, i);
        bool right = true;
        if(len - 1 - i)
            right = judge(value, len - 1 - i);
        return (left && right);
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_39605679/article/details/80907242
今日推荐