劍指offer_面試題24_二叉搜索樹的後序遍歷序列(遞歸)

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

二叉搜索樹規律:

1、若 左子樹 不空,則 左子樹上所有結點的值 均小於它的根結點的值。

2、若 右子樹 不空,則 右子樹上所有結點的值 均大於它的根結點的值。

3、左右子樹也分別爲二叉搜索樹。

舉例1:

輸入數組:{5、7、6、9、11、10、8}

後序遍歷規律:左 - 右 - 根

5小於8====》5、7、6  左子樹    ===判斷是否都小於8====》是 ====遞歸====》5 左子樹;7 右子樹;6 根 ======》符合

9大於8====》9、11、10 右子樹  ===判斷是否都大於8====》是====遞歸=====》9 左子樹;11 右子樹;10 根======》符合

====》8  根

舉例2:

輸入數組:{7,4,6,5}

====》5 根

====》7大於5,因此 7、4、6 ====》屬於右子樹 ===判斷是否都大於5==》否===》說明不是 二叉搜索樹後序遍歷序列

算法如下:

bool VerifySquenceofBST(int a[],int length)
{
    if(NULL == a || length <= 0)
        return false;

    int pRoot = length - 1;

/**二叉搜索樹的四個規律*/
    /**1、在二叉搜索樹中左子樹的結點小於於根結點*/
    int i = 0;
    while(i < length - 1)
    {
        if(a[i] > a[pRoot])
            break;
        i++;
    }

    /**2、在二叉搜索樹中右子樹的結點大於根結點*/
    int j = i;
    while(j < length - 1)
    {
        if(a[j] < a[pRoot])
            return false;
        j++;
    }

    /**3、判斷左子樹是不是二叉搜索樹*/
    bool left = true;
    if(i > 0)
        left = VerifySquenceofBST(a, i);

    /**4、判斷右子樹是不是二叉搜索樹*/
    bool rigth = true;
    if(i < length - 1)
        rigth = VerifySquenceofBST(a + i, length - i - 1);

    return (left && rigth);
}

總結:

舉實例分析,有助理解

算法 與 規律 相對應,分析過程,總結規律。

/* 點滴積累,我的一小步 */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章