面试题33:二叉搜索树的后序遍历序列

一、题目

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

    例如:输入数组{5, 7, 6, 9, 11, 10, 8},则返回true,因为这个整数序列如图二叉搜索树的后序遍历结果。如果输入的数组是{7, 4, 6, 5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回false。


二、解法

    分析:在后序遍历得到的序列中,最后一个数是树的根节点的值,数组中前面的数字可以分为两部分:第一部分是左子树节点的值,他们都比根节点小,第二部分是右子树节点的值,他们都比根节点的值大。

    以数组{5, 7, 6, 9, 11, 10, 8}为例,后序遍历的最后一个数字8就是根节点的值,在这个数组中,前三个数字5,7,6都比8小,是值8的左子树的节点;后三个数字9,11,10都比8大,是值8的节点的右子树的节点。下面就是一个递归过程:对于{5, 7, 6},6是左子树的根节点的值......

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;
        vector<int> leftSequence;
        for(int m = 0; m<i; ++m)
            leftSequence.push_back(sequence[m]);
        if(i>0)
            left = VerifySquenceOfBST(leftSequence);
        bool right = true;
        vector<int> rightSequence;
        for(int n=i; n<length-1;++n)
            rightSequence.push_back(sequence[n]);
        if(i<length-1)
            right = VerifySquenceOfBST(rightSequence);
        return (left&right);
        
    }
};

猜你喜欢

转载自blog.csdn.net/sinat_36161667/article/details/80830451