輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。
首先確定二叉搜尋樹的定義:
二叉查詢樹(binary search tree),它或者是一棵空樹,或者是具有下列性質的二叉樹:
1.若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2.若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3.它的左、右子樹也分別為二叉排序樹。
換句話說,在沒有結點,只要它有子結點,就是左結點的值小於根結點的值大於右結點的值。
根據二叉搜尋樹的數值排序特點,中序遍歷(根左右)遍歷二叉搜尋樹會得到有序的序列。
思路:首先後序遍歷的特徵就是序列的結尾總是根結點,根據二叉搜尋樹的特徵,對於乙個根結點它的左子樹小於它,它的右子樹大於它。也就是說從序列中彈出根結點之後,剩下的就是它的左右子樹的全部結點,如果它是二叉搜尋樹,把根結點就能插入進去,左面都是比它大的,右面都是比它小的。
# -*- coding:utf-8 -*-
class solution:
def verifysquenceofbst(self, sequence):
# write code here
# 只有第一次根結點為空是false
# 所以判斷子樹的時候,要保證sequence不是空
if not sequence:
return false
if len(sequence) == 1:
return true
i=0length = len(sequence)
# 找出左子樹
while sequence[i] < sequence[-1]:
i+=1
# 找出左子樹之後,理應剩下的都是右子樹,也就是都比根結點大的。
# 所以在剩下的結點裡如果出現小於的就不是平衡二叉樹
for j in range(i,len(sequence)-1):
if sequence[j] < sequence[-1]:
return false
# 如果滿足條件,就把左右子樹切分出來
left_s = sequence[:i]
right_s = sequence[i:length-1]
# 這塊是不能直接返回self.verifysquenceofbst()左右子樹的返回結果的與
# 因為對於第一次根結點為空,那空樹就不是搜尋樹
# 對於子樹是空樹,判斷應該是為真,所以這裡需要判斷子樹序列是不是空
# 並且用標誌變數,儲存結果
left, right = true, true
if len(left_s) > 0:
left = self.verifysquenceofbst(left_s)
if len(right_s) > 0:
right = self.verifysquenceofbst(right_s)
return left and right
劍指Offer 刷題 重建二叉樹
definition for binary tree public class treenode public class solution int val pre prel 前序遍歷序列中的第乙個數即為根節點 treenode tree newtreenode val int mid 0 找到根節...
劍指Offer刷題筆記 二叉樹的映象
操作給定的二叉樹,將其變換為源二叉樹的映象。思路 遞迴的交換左右子樹。不是交換結點的數值,直接交換結點。coding utf 8 class treenode def init self,x self.val x self.left none self.right none class soluti...
劍指Offer刷題筆記 二叉樹的深度
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。就是深度搜尋,找到最大深度。coding utf 8 class treenode def init self,x self.val x self.left none self.r...