一刷劍指offer(24)——二叉搜索樹的後序遍歷序列

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

在後序遍歷得到的序列中,最後一個數字是樹的根結點。數組中前面的數字可以分爲兩部分:第一部分是左子樹的結點,它們都比根結點小;第二部分是右子樹的結點,它們都比根結點大。

以數組{5,7,6,9,11,10,8}爲例,後序遍歷的結果的最後一個數字8是根結點。在這個數組裏,前3個數字5、7、6都比8小,是左子樹結點;後3個數字9、11、10都比8大,是右子樹結點。接下來採取遞歸,可以確定數組每一部分對應的子樹結構。

如果給定數組中第一個元素就大於根結點,則證明不存在左子樹。

比如{7,4,6,5},因爲7>5,所以不存在左子樹,繼續往後,發現右子樹中有4的存在,而4<5,與之矛盾,因此該二叉搜索樹是不存在的。

bool VerifySquenceOfBST(int sequence[],int length)
{

    if(sequence==NULL || 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=false;
    if(i>0)
        left=VerifySquenceOfBst(sequence,i);
    //判斷右子樹是否爲二叉搜索樹
    bool right=false;
    if(i<length-1)
        right=VerifySquenceOfBst(sequence+i,length-i-1);
    return (left && right);
}

如果要求處理一棵二叉樹的遍歷序列,我們可以先找到二叉樹的根結點,再基於根結點把整棵樹的遍歷序列拆分成左子樹和右子樹。在遞歸處理這兩個子序列。

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