剑指offer题目23:二叉搜索树的后序遍历序列

题目描述

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

解答思路

问题不难,就是一开始看漏了是说二叉搜索树而不是二叉树而卡了一下,后面知道二叉搜索树的定义就是左子树比根要小,右子树要比根要大就有了思路了。

首先是自己构建1个二叉搜索树构思一下。

上面的二叉树后序输出是:5,7,6,9,11,10,8

错误的二叉树输出有:5,12,6,9,11,10,8

通过观察我们得出正确二叉树的规律:

  1. 输出的最后1个节点肯定是根
  2. 前面的连续的比根节点要小的都是左子树
  3. 后面的连续的比根节点要大的都是右子树

如果不符合上面2,3点的肯定是错误搜索树,我们在观察一下,在程序上的表现就是当出现1个比根节点要大的元素a的话,a和后面的元素都是右子树。不可能在出现比根要小的元素。

实现代码

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        bool result = false;

        if(sequence.size()) {
            int rootIndex = sequence.size() - 1;
            int root = sequence[rootIndex];

            vector<int> leftTree;
            vector<int> rightTree;

            // 分类左右子树且判断当前左子树是否全部小于跟,右子树全部大于跟
            for (int i = 0; i < rootIndex - 1; ++i)
            {
                if(sequence[i] < root) {
                    if(rightTree.size()) {
                        return false;
                    }

                    leftTree.push_back(sequence[i]);
                } else {
                    rightTree.push_back(sequence[i]);
                }
            }

            result = true;
            if(leftTree.size()) {
                result = result && VerifySquenceOfBST(leftTree);
            }

            if(result && rightTree.size()) {
                result = result && VerifySquenceOfBST(rightTree);
            } 

        }

        return result;
    }
};
posted @ 2019-04-02 15:22  {-)大傻逼  阅读(147)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。