題目:輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 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...