劍指offer之二叉搜索樹的後序遍歷序列

1.問題描述

題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。
例如,輸入數組{5,7,6,9,11,10,8} ,則返回true,數組{7,4,6,5},則返回false。

2.分析

  • 什麼是二叉搜素樹?若左子樹不爲空,則左子樹上節點的值都小於根節點值,若右子樹不爲空,則右子樹上節點的值都打印根節點的值;
  • 此題一看,就知道是二叉搜索樹是一個遞歸定義,我們使用遞歸的方法;

例如:輸入{5,7,6,9,11,10,8} ,其中8是根節點,那麼{5,7,6}都小於8,所以,是左子樹;{11,10,8}都大於8,,所以是右子樹。
之後分別分析{5,7,6}{11,10,8},都是一樣的。

使用遞歸,那麼要有退出遞歸的條件,即:遞歸邊界,邊界應該是,一顆樹只有一個節點,即:一顆樹其實是一個葉子節點的時候,那麼就停止,返回true

相反,如何判斷不是二叉搜索樹?比如{7,4,6,5},應爲7大於5,那麼左子樹爲{},右子樹爲{7,4,6},但是右子樹的4小於5,所以錯誤。這不是一顆二叉搜索樹。

3.源代碼:

// from [start,end)
bool VerifySquenceOfBSTCore(int sequence[],int start,int end)
{
    //若end - start ==1,表示此二叉樹是一個葉子節點
    if(end - start == 1)
        return true;

    int rootValue = sequence[end - 1];

    int leftIndex = 0;
    while(leftIndex < end -1 && sequence[leftIndex] < rootValue ) ++leftIndex;

    int rightIndex = leftIndex;

    while(rightIndex<end -1 && sequence[rightIndex] > rootValue) ++rightIndex;

    //如果右子樹全部都大於根節點的值,則rightIndex應該是等於end - 1
    if(rightIndex != end -1)
        return false;

    bool leftTrue = true;
    if(leftIndex > 0)
        leftTrue = VerifySquenceOfBSTCore(sequence,0,leftIndex);
    bool rigthTrue = true;
    if(leftIndex < end -1)
        rigthTrue = VerifySquenceOfBSTCore(sequence,leftIndex,rightIndex);

    return leftTrue&&rigthTrue;
}

bool VerifySquenceOfBST_1(int sequence[], int length)
{
    if(sequence == nullptr || length <=0)
        return false;

    return VerifySquenceOfBSTCore(sequence,0,length);

}

4.結論

  • 知道什麼是二叉搜索樹
  • 二叉搜索樹的後序遍歷
  • 涉及到樹,很多時候使用遞歸方法可以方便解決問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章