劍指Offer 33 二叉搜尋樹的後序遍歷序列

2021-09-09 01:34:17 字數 1573 閱讀 4590

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

例:

輸入陣列[5, 7, 6, 9, 11, 10, 8], 則返回true。因為這個整數序列是下樹的後序遍歷。

8

/ \

6 10

/ \ / \

5 7 9 11

如果輸入的陣列是[7, 4, 6, 5],則由於沒有那棵二叉搜尋樹的後序遍歷結構是這個序列,

因此返回false。

和面試題7類似,理由後序遍歷最後乙個節點是根節點,左樹小於根,右樹大於根,逐步檢驗每個子樹是否符合二叉搜尋樹規範。

時間複雜度:o(n^2),只有左樹或右樹的時候,每次都要檢查t(n) = t(n-1) + o(n-1)

空間複雜度:o(n),只有左樹或右樹的時候

def

sequence_of_bst

(postorder)

:"""

:param postorder: lrd of binary search tree

:return: bool

"""iflen

(postorder)

<=1:

return

true

root = postorder[-1

]# right_child = postorder.filter(lambda x: x > root, postorder)

# left_child = postorder.filter(lambda x: x < root, postorder)

count =

0for node in postorder[:-

1]:if node < root:

count +=

1else

:break

right_child = postorder[count:-1

] left_child = postorder[

:count]

for node in right_child:

if node < root:

return

false

if left_child:

left = sequence_of_bst(left_child)

else

:return

true

if right_child:

right = sequence_of_bst(right_child)

else

:return

true

return left and right

能否不在每個節點檢查子樹的合規,而是先按照該序列構建二叉搜尋樹,然後再從底向上返回每個子樹的最大和最小值,按照每個節點屬於左樹還是右樹檢查合規。可以這樣的話,時間複雜度應該是o(n)的。

# todo: 具體**待實踐。

劍指offer 33 二叉搜尋樹的後序遍歷

題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 遞迴。最後乙個數字是樹的根節點,第一部分是左子樹節點的值,都比根節點小。第二部分是右子樹節點的值,都比根節點大。class solution de...

劍指Offer 33 二叉搜尋樹的後序遍歷

由於是後序遍歷,所以陣列最後乙個元素是根節點 遞迴開始傳入起始元素 和 末尾元素 當起始索引 left right 結束遞迴 執行迴圈,找到第乙個比根節點大的元素 temp 它的左面是樹的左子樹,右面到根節之間是樹的右子樹 判斷temp 到 root 之間的結點是否全部大於根節點 進行下一次遞迴,直...

劍指offer 33 二叉樹映象

操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 5 複製 首先先理解題意,映象通過以下幾個步驟可以實現 可以看到首先對根節點的左右進行翻轉。再遞迴的對左子樹,以及右子樹進行翻轉。之前講過,鍊錶的題目分為四...