溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

劍指offer:二叉搜索樹(shù)的后序遍歷序列

發(fā)布時(shí)間:2020-08-09 16:04:41 來(lái)源:網(wǎng)絡(luò) 閱讀:531 作者:Jayce_SYSU 欄目:編程語(yǔ)言

題目描述
輸入一個(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
向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI