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

题目:

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

思路:

二叉搜索树是一种特殊的二叉树,后序遍历的结果,最后一个节点是根节点,前面的节点中,小于根节点的构成左子树,大于根节点的构成右子树,因此判断该数组是不是某二叉搜索树的后序遍历的结果的关键就是判断除最后一个节点之外的节点是否可以分为连续的两段,前面一段值均比最后一个节点小,后面一段值均比最后一个节点大,并且在相应的左子树和右子树中也能够这样划分。

所以思路就是先保存最后一个节点作为根节点,然后从前往后遍历,把所有比根节点小的节点存入leftTree数组中,直到碰到一个比根节点大的,然后继续往后遍历,把所有比根节点大的节点存入rightTree数组中,如果在这一过程中又遇到比根节点小的,直接返回false。如果没有返回false,再递归的判断分出的两个序列是不是二叉树的后序遍历。

参考代码:

在线测试

https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return false;
        int len=sequence.size();
        int root=sequence[len-1];
        vector<int> leftTree;
        vector<int> rightTree;
        int i;
        for(i=0;i<len-1;i++)//停止条件是倒数第二个节点
        {
            if(sequence[i]<root)
                leftTree.push_back(sequence[i]);
            else
                break;
        }
        for(;i<len-1;i++)//停止条件是倒数第二个节点
        {
            if(sequence[i]>root)
                rightTree.push_back(sequence[i]);
            else
                return false;
        }
        bool left=true;
        bool right=true;
        if(!leftTree.empty())//必须先判断是不是空,因为如果是空还递归调用函数的话,第一个if判断,空树会直接返回false,而事实上,只存在左子树或只存在右子树的情况也是可以有的
            left=VerifySquenceOfBST(leftTree);
        if(!rightTree.empty())
            right=VerifySquenceOfBST(rightTree);
        return (left&&right);

    }
};

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81155144