判斷序列是否為二叉排序樹的後序遍歷 python

2022-08-05 18:33:11 字數 1499 閱讀 8606

題目:給定一個序列,判斷其是不是一顆二叉排序樹的後序遍歷結果

分析:首先要知道什麼是排序二叉樹,二叉排序樹是這樣定義的,二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

(4)沒有鍵值相等的節點

因此,二叉排序樹按照“左-右-根”的順序遍歷得到的序列具有這樣的特點:該序列從中間分開,左邊序列的值都小於序列的最後一個值,右邊序列的值都大於序列的最後一個值。很明顯,序列的最後一個值就是根節點,而這個分界點就是左右子樹的分界點,因此,我們按順序遍歷這個序列,找到第一個大於根節點的值,就區分出了左右子樹,同時,如果這個點左邊的值大於根節點的值或者該點右邊的值小於根節點的值,則說明此序列不符合要求,如果符合要求,則繼續對左右子樹按照上面的過程進行判斷,明顯這是個需要用遞迴解決的問題。

判斷的**:

class

solution:

#判斷序列是否是二叉排序樹的後續遍歷序列

defverifysquenceofbst(self, sequence):

if len(sequence)==0:

return

false

if len(sequence)==1:

return

true

root=sequence[-1]#

根節點的值

border=len(sequence)-1#

必須初始化邊界點的值,因為有可能沒有右子樹,就無法按照第一個大於root的方法找到border

for i in range(len(sequence)-1):

if sequence[i]>root:

border=i

break

for i in range(len(sequence)-1):#

邊界點左邊的值小於root,右邊的值大於root

if sequence[i]and i>border:

return

false

if sequence[i]>root and ireturn

false

if border==len(sequence)-1 or border==0:#

沒有左子樹或沒有右子樹

return self.verifysquenceofbst(sequence[:-1])

else

:

return (self.verifysquenceofbst(sequence[:border]) and self.verifysquenceofbst(sequence[border:len(sequence)-1]))

在判斷的過程中要注意,按照第一個大於root的方法尋找邊界有可能或找不到,此時右子樹是不存在的,因此要對border進行初始化,另外對左子樹或右子樹不存在的情況要特殊處理。