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

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

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

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

(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進行初始化,另外對左子樹或右子樹不存在的情況要特殊處理。

判斷是否為二叉搜尋樹的後序遍歷序列

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。知識點 二叉排序樹 binary sort tree 又稱二叉查詢樹 binary search tree 亦稱二叉搜尋樹。二叉排序樹或者是一棵空樹,或者...

二叉樹 判斷整數序列是否為二叉搜尋樹的後序序列

題目 判斷整數序列是不是二叉搜尋樹的後序遍歷 思路 後序遍歷根在最後 1.從開頭和根依次比較,劃分左右子樹 2.右子樹一但有 根的,false 3.遞迴判斷左右子樹 4.返回左右子樹的bool值想與 bool isposorder int arr,int len 右子樹一旦有小於root的值就是fa...

判斷二叉排序樹是否相同

problem description 判斷兩序列是否為同一二叉搜尋樹序列 input 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。接下去的n行有n個序列,每...