您好,登錄后才能下訂單哦!
題目描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
class Solution:
"""
一個二叉搜索樹BST滿足: max(左子樹) < 根節點 < min(右子樹)
由于題目給出的是一個后序遍歷,那么序列的最后一個元素就應該是根節點。
因此我們從BST的定義出發,遍歷整個序列,找到第一個大于根節點的元素k,k以前的元素屬于左子樹,
從k開始到根節點之前的元素屬于右子樹。
如果遍歷整個序列之后得到的左右子樹都滿足BST的定義,則遞歸判斷左子樹和右子樹是否滿足BST定義
"""
def VerifySquenceOfBST(self, sequence):
if not sequence:
return False
root = sequence[-1] # 獲取根節點
"""
查找第一個大于根節點的元素,得到左右子樹的分界點
"""
idx = 0
while idx < len(sequence) - 1:
if sequence[idx] > root:
break
idx += 1
# 需要驗證右子樹是否滿足BST,即所有右子樹的節點都大于根節點,
# 如果不滿足則這個序列不是BST的后序遍歷
for i in range(idx, len(sequence) - 1):
if sequence[i] < root:
return False
# 如果這個序列是BST的后序遍歷,那么遞歸判斷左右子樹是否分別滿足BST
left = True
if idx > 0:
left = self.VerifySquenceOfBST(sequence[: idx])
right = True
if idx < len(sequence) - 1:
right = self.VerifySquenceOfBST(sequence[idx: -1])
return left and right
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。