輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。
5
/ \2 6
/ \1 3
示例 1:
輸入: [1,6,3,2,5]
輸出: false
示例 2:
輸入: [1,3,2,6,5]
輸出: true
陣列長度 <= 1000
2.1 分治 + 遞迴
後續遍歷:左-右-root
所以核心思想就是:
把 root 先找出來
遍歷,並和 root 對比,找到 左子樹和右子樹的邊界
遞迴求解
class
solution
:def
verifypostorder
(self, postorder: list[
int])-
>
bool:if
not postorder or
len(postorder)==1
:return
true
root = postorder[-1
] index =
0for i in
range
(len
(postorder)):
if postorder[i]
>= root:
index = i
break
left = postorder[
: index]
right = postorder[index:-1
]# 去掉最後乙個 root
for num in right:
if num < root:
return
false
return self.verifypostorder(left)
and self.verifypostorder(right)
複雜度分析:
2.2 輔助單調棧
參考:leetcode優秀題解
class
solution
:def
verifypostorder
(self, postorder:
[int])
->
bool
: stack, root =
,float
("+inf"
)for i in
range
(len
(postorder)-1
,-1,
-1):
if postorder[i]
> root:
return
false
while
(stack and postorder[i]
< stack[-1
]): root = stack.pop())
return
true
複雜度分析:
參考:leetcode優秀題解
劍指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 複製 首先先理解題意,映象通過以下幾個步驟可以實現 可以看到首先對根節點的左右進行翻轉。再遞迴的對左子樹,以及右子樹進行翻轉。之前講過,鍊錶的題目分為四...