1. 程式人生 > >劍指Offer-Python-二叉搜尋樹的後續遍歷序列

劍指Offer-Python-二叉搜尋樹的後續遍歷序列

題目:二叉搜尋樹的後續遍歷序列

輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。

思路:二叉搜尋樹的特點是,左子樹的值小於根節點的值,右子樹的值大於根節點的值。後續遍歷的話是先遍歷左子樹、再遍歷右子樹,最後遍歷根節點。所以所給序列的最後一個元素為根節點的值。陣列中的數字可以分為兩個部分:第一部分是左子樹節點的值,它們都比根節點的值小;第二部分是右子樹節點的值,它們都比根節點的值大。
需要考慮只有左子樹和只有右子樹的情況。

# -*- coding:utf-8 -*-
class Solution
:
def VerifySquenceOfBST(self, sequence): # write code here if sequence == []: return None if len(sequence) == 1: return True for i in range(len(sequence)-1): if sequence[i] > sequence[-1]: break for j in
range(i+1, len(sequence)-1): if sequence[j] < sequence[-1]: return False left_BST = sequence[:i] right_BST = sequence[i:-1] if left_BST and right_BST: return self.VerifySquenceOfBST(left_BST) and self.VerifySquenceOfBST(right_BST) elif
left_BST: return self.VerifySquenceOfBST(left_BST) else: return self.VerifySquenceOfBST(right_BST)

簡介版:

連結:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
來源:牛客網
# coding:utf-8
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if sequence==None or len(sequence)==0:
            return False
        length=len(sequence)
        root=sequence[length-1]
        # 在二叉搜尋 樹中 左子樹節點小於根節點
        for i in range(length):#迴圈的值設定得很巧妙,和下方的left、right初始值對應
            if sequence[i]>root:
                break
        # 二叉搜尋樹中右子樹的節點都大於根節點
        forin range(i,length):
            if sequence[j]<root:
                return False
        # 判斷左子樹是否為二叉樹
        left=True
        if  i>0:#說明存在左子樹,求左子樹是否為後續遍歷,然後更新left的值
            left=self.VerifySquenceOfBST(sequence[0:i])
        # 判斷右子樹是否為二叉樹
        right=True
        if i<length-1:#說明存在右子樹,判斷右子樹是否為後續遍歷。如果不存在右子樹,預設為真。
            right=self.VerifySquenceOfBST(sequence[i:-1])
        return left and right