輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。
我們隨便構造乙個二叉搜尋樹,看看有什麼規律,假設我們構造了如下圖所示這樣的二叉樹,則有:
那麼我們後序遍歷的結果則是:[ 1,4,2,6,11,9,5]。我們可以看到最後乙個數字就是這顆樹的根部,同樣的,由於具有二叉搜尋樹的特點,右邊的子節點的數值一定比左邊的更大,左邊的數值則一定比右邊的更小,因此可得[1,4,2]是我們左樹遍歷的結果,[6,9,11]是右樹遍歷的結果,我們只要在這個給定的陣列當中找到了乙個數值比最後乙個數值更大,那麼我們就找到了右子樹,再用遞迴分別對左子樹和右子樹進行遞迴即可。因此這道題最重要的就是需要尋找到第乙個需要比最後乙個數字更大的那個數值的索引。**如下:
#-*- coding:utf-8 -*-
class
solution:
defverifysquenceofbst(self, sequence):
#write code here
ifnot
sequence:
return
false
root = sequence[-1]
#根據二叉搜尋樹的性質,左孩子的每個結點的值都小於根節點,這個i並不會因迴圈的消失而消失,i代表陣列當中的索引,我們人為做的是第一次簡要的遞迴判斷
for i in
range(len(sequence)):
if sequence[i] >root:
break
#判斷是否右孩子的每個結點的值都大於根結點
for j in
range(i, len(sequence)):
if sequence[j]
return
false
left =true
#遞迴開始,i > 0 的時候證明有左孩子,i<0就證明沒有。說明左樹已經遍歷完畢
if i >0:
#遞迴遍歷左孩子
left =self.verifysquenceofbst(sequence[ : i])
right =true
#證明有右孩子,通過i的值不在最後乙個結點判斷,len(sequence) - 1 為sequence的最後乙個結點.如果i已經在最後乙個節點了,則不進行判斷
if i < len(sequence) - 1:
right = self.verifysquenceofbst(sequence[i : -1])
return left and right
劍指Offer17 二叉樹的映象
操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 5先交換根節點的兩個子結點之後,我們注意到值為10 6的結點的子結點仍然保持不變,因此我們還需要交換這兩個結點的左右子結點。做完這兩次交換之後,我們已經遍歷...
劍指offer 17 重建二叉樹
題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。思路 根據中序遍歷和前序遍歷可以確定二叉樹,具體過程為 1 根據前序序列第乙個結點確定根結點 2 根據根結點在中序序列中的...
劍指offer 17 樹的子結構
輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 這是典型二叉樹遞迴問題。倆顆樹都不為空時,如果根節點相同,那麼判斷root2是不是root1的子樹,如果不是,那麼判斷root2是不是root1左子樹的子樹,如果還不是,那麼判斷root2是不是root1右子樹的...