劍指offer-24.二叉搜索樹的後序遍歷序列

0 題目

輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。數組

1 分析

後序遍歷的結果,根節點在最後一個,前面的部分,前一部分是右子樹,應該都小於根節點,後一部分是左子樹,都大於根節點。blog

所以遞歸處理就能夠了遞歸

  public:
    bool VerifySquenceOfBST(vector<int> sequence)
    {
        return aux(sequence, 0, sequence.size() - 1);
    }
    bool aux(vector<int> sequence, int begin, int end)
    {
        if (sequence.empty() || begin > end)
        {
            return false;
        }
        int root = sequence[end];
        int i = begin;

        // 找到右子樹的第一個節點
        for (; i < end; ++i)
        {
            if (sequence[i] > root) //i座標爲右子樹第一個節點
                break;
        }

        // 判斷右子樹是否符合要求
        for (int j = i; j < end; ++j)
        {
            if (sequence[j] < root)
                return false;
        }

        // 遞歸判斷左右子樹
        bool left = true;
        if (i > begin)
        {
            left = aux(sequence, begin, i - 1);
        }

        bool right = true;
        if (i < end - 1)
        {
            right = aux(sequence, i, end - 1);
        }
        return left && right;
    }

  

 

或是更改一下判斷順序class

bool VerifySquenceOfBST(vector<int> sequence)
{
    return aux(sequence, 0, sequence.size() - 1);
}
bool aux(vector<int> sequence, int begin, int end)
{
    if (sequence.empty())
    {
        return false;
    }
    if (begin >= end)
    {
        return true;
    }
    int root = sequence[end];
    int i = begin;
    for (; i < end; ++i)
    {
        if (sequence[i] > root) //i座標爲右子樹第一個節點
            break;
    }

    for (int j = i; j < end; ++j)
    {
        if (sequence[j] < root)
            return false;
    }

    bool left = true;
    left = aux(sequence, begin, i - 1);

    bool right = true;
    right = aux(sequence, i, end - 1);
    return left && right;
}
相關文章
相關標籤/搜索