【劍指offer】判斷一個序列是否是二叉搜索樹的后序遍歷,C++實現


原創文章,轉載請注明出處!

本題牛客網地址

博客文章索引地址

博客文章中代碼的github地址

1.題目

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

      舉例:序列{5,7,6,9,11,10,8}是下圖二叉搜索樹的后序遍歷結果。

2.思路

性質:

  • 二叉排序樹的性質:左子樹上所有節點的值均小於它的根節點;右子樹上所有節點的值均大於它的根節點。
  • 二叉排序樹后序遍歷的性質:序列最后一個數字是根節點,序列剩余部分分成兩部分,前一部分是左子樹,后一部分是右子樹。

舉例:

  • 判斷序列{5,7,6,9,11,10,8}是否是二叉排序樹的后序遍歷。其中,8是根節點,{5,7,6}比8小是左子樹,{9,11,10}比8大是右子樹。
  • 判斷{5,7,6}是否是二叉排序樹,其中6是根節點,5比6小是左子樹,7比6大是右子樹。
  • 判斷{9,11,10}是否是二叉排序樹,其中10是根節點,9比10小是左子樹,11比10大是右子樹。

3.代碼

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        return bst(sequence, 0, sequence.size() - 1);
    }
private:
    bool bst(vector<int> seq, int begin, int end){
        // 邊界條件
        if(seq.empty() || begin > end)
            return false;

        // 划分左右子樹,並判斷左右子樹和根節點的關系
        int i = begin;
        for(; i < end; ++i)
            if(seq[i] > seq[end])
                break;

        int j = i;
        for(; j < end; ++j)
            if(seq[j] < seq[end])
                return false;

        // 判斷左子樹是不是二叉搜索樹
        bool left = true;
        if(i > begin)
            left = bst(seq, begin, i - 1);

        // 判斷右子樹是不是二叉搜索樹
        bool right = true;
        if(i < end - 1)
            right = bst(seq, i , end - 1);

        return left && right;
    }
};

4.測試用例

  • 空指針
  • 后序遍歷對應一顆BST二叉樹
    • 一個結點的BST二叉樹
    • 無左子樹的BST二叉樹
    • 無右子樹的BST二叉樹
    • 完全二叉樹
  • 后序遍歷不對應一顆BST二叉樹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM