新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
劍指offer:二叉搜索樹的后序遍歷序列-創(chuàng)新互聯(lián)
題目描述
輸入一個整數(shù)數(shù)組,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷的結(jié)果。如果是則輸出Yes,否則輸出No。假設(shè)輸入的數(shù)組的任意兩個數(shù)字都互不相同。
class Solution:
"""
一個二叉搜索樹BST滿足: max(左子樹) < 根節(jié)點 < min(右子樹)
由于題目給出的是一個后序遍歷,那么序列的最后一個元素就應(yīng)該是根節(jié)點。
因此我們從BST的定義出發(fā),遍歷整個序列,找到第一個大于根節(jié)點的元素k,k以前的元素屬于左子樹,
從k開始到根節(jié)點之前的元素屬于右子樹。
如果遍歷整個序列之后得到的左右子樹都滿足BST的定義,則遞歸判斷左子樹和右子樹是否滿足BST定義
"""
def VerifySquenceOfBST(self, sequence):
if not sequence:
return False
root = sequence[-1] # 獲取根節(jié)點
"""
查找第一個大于根節(jié)點的元素,得到左右子樹的分界點
"""
idx = 0
while idx < len(sequence) - 1:
if sequence[idx] > root:
break
idx += 1
# 需要驗證右子樹是否滿足BST,即所有右子樹的節(jié)點都大于根節(jié)點,
# 如果不滿足則這個序列不是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
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁標題:劍指offer:二叉搜索樹的后序遍歷序列-創(chuàng)新互聯(lián)
分享路徑:http://www.ef60e0e.cn/article/dspphe.html