劍指Offer-Python-二叉搜尋樹的後續遍歷序列
阿新 • • 發佈:2019-02-08
題目:二叉搜尋樹的後續遍歷序列
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出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
# 二叉搜尋樹中右子樹的節點都大於根節點
for j in 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