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