二叉搜尋樹的後序遍歷序列(C 中等)

2021-10-10 01:44:10 字數 1654 閱讀 9258

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

參考以下這顆二叉搜尋樹:

示例 1:

輸入: [1,6,3,2,5]

輸出: false

示例 2:

輸入: [1,3,2,6,5]

輸出: true

如果這題說的是判斷該陣列是不是某二叉搜尋樹的中序遍歷結果,那麼這道題就非常簡單了,因為二叉搜尋樹的中序遍歷結果一定是有序的,我們只需要判斷陣列是否有序就行了。但這道題要判斷的是不是某二叉搜尋樹的後序遍歷結果,這樣就有點難辦了。

二叉搜尋樹的特點是左子樹的值《根節點《右子樹的值。而後續遍歷的順序是:左子節點→右子節點→根節點

比如下面這棵二叉樹,他的後續遍歷是

我們知道後續遍歷的最後乙個數字一定是根節點,所以陣列中最後乙個數字9就是根節點,我們從前往後找到第乙個比9大的數字10,那麼10後面的[10,12](除了9)都是9的右子節點,10前面的[3,5,4]都是9的左子節點,後面的需要判斷一下,如果有小於9的,說明不是二叉搜尋樹,直接返回false。然後再以遞迴的方式判斷左右子樹。

再來看乙個,他的後續遍歷是[3,5,13,10,12,9]

我們來根據陣列拆分,第乙個比9大的後面都是9的右子節點[13,10,12]。然後再拆分這個陣列,12是根節點,第乙個比12大的後面都是12的右子節點[13,10],但我們看到10是比12小的,他不可能是12的右子節點,所以我們能確定這棵樹不是二叉搜尋樹。搞懂了上面的原理我們再來看下**。

**如下:

class

solution

bool

helper

(vector<

int>

& postorder,

int left,

int right)

int pos=tem;

//因為postorder[tem]前面的值都是比根節點root小的,

//我們還需要確定postorder[tem]後面的值都要比根節點root大,

//如果後面有比根節點小的直接返回false

while

(pos

//然後對左右子節點進行遞迴呼叫

return

helper

(postorder,left,tem-1)

&&helper

(postorder,tem,right-1)

;}};

執行用時:0 ms, 在所有 c++ 提交中擊敗了100.00

%的使用者

記憶體消耗:7 mb, 在所有 c++ 提交中擊敗了38.04

%的使用者

二叉搜尋樹的後序遍歷序列(C )

題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 1.搜尋二叉樹的定義為根節點的左子樹都小於根節點,右子樹都大於根節點 2.因為是後序遍歷 左右根 所以根節點即序列中最後乙個元素,所以比根節點小的節點...

二叉搜尋樹的後序遍歷序列

題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是返回true,否則返回false。假設輸入的陣列的任意兩個數字都不相同。解答 二叉搜尋樹後序遍歷最後訪問的是根節點,根據根節點將陣列分成兩部分,前面一部分即左子樹值小於根節點值,後面一部分即右子樹的值大於根節點 再遞迴的檢查...

二叉搜尋樹的後序遍歷序列

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。include using namespace std bool verifysquenceofbst int sequence,int length int j...